Hibernate在运行时更改获取模式 [英] Hibernate change fetch mode in runtime

查看:128
本文介绍了Hibernate在运行时更改获取模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用一对多关系将两个表关联在一起:
employee - > department:和employee表中的department_id之间的关系。



我使用hibernate:和我的hibernate映射文件是:

 <?xml version =1.0encoding =utf-8 >?; 
<!DOCTYPE hibernate-mapping PUBLIC - // Hibernate / Hibernate映射DTD 3.0 // EN
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"> ;
<! -
由MyEclipse持久性工具自动生成的映射文件
- >
< hibernate-mapping default-lazy =false>
name =com.ebla.moi.correspondence.model.entity.user.Usertable =user>
< id name =idtype =java.lang.Long>
< column name =id/>
< generator class =identity/>
< / id>
class =com.ebla.moi.correspondence.model.entity.department.Department
fetch =selectname =department>
< column name =department_id/>
< /多对一>
< property generated =neverlazy =falsename =nametype =java.lang.String>
< column length =128name =namenot-null =true/>
< / property>
< property generated =neverlazy =falsename =emailtype =java.lang.String>
< column length =128name =emailnot-null =trueunique =true/>
< / property>
< property generated =neverlazy =falsename =maritalStatustype =java.lang.Short>
< column name =marital_statusnot-null =true/>
< / property>
< property generated =neverlazy =falsename =hireDatetype =java.lang.String>
< column length =64name =hire_date/>
< / property>
< / class>
< / hibernate-mapping>

第二个映射文件是:

 <?xml version =1.0encoding =utf-8?> 
<!DOCTYPE hibernate-mapping PUBLIC - // Hibernate / Hibernate映射DTD 3.0 // EN
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"> ;
<! -
由MyEclipse持久性工具自动生成的映射文件
- >
< hibernate-mapping default-lazy =false>
name =com.ebla.moi.correspondence.model.entity.department.Departmenttable =department>
< id name =idtype =java.lang.Long>
< column name =id/>
< generator class =identity/>
< / id>
< property generated =neverlazy =falsename =nametype =java.lang.String>
< column length =256name =nameunique =true/>
< / property>
< set inverse =truename =userssort =unsorted>
< key>
< column name =department_id/>
< / key>
< / set>
< / class>
< / hibernate-mapping>

我的问题是:有时我需要让员工与他的部门联系,其他时间我只需要没有部门信息的员工信息.....以及与员工部门同样的事情....使用休眠状态上方的映射文件带来部门和用户,如果我需要员工或不... ...如何定义我需要休眠以获取我所需要的内容......

谢谢

解决方案

div>

您可以将关系映射为lazy并编写两个查询来获取数据: 简单的查询来获取您的数据(懒惰)。例如。 select e from Employee e where ...


  • 使用fetch join强制Hibernate获取孩子的同一查询。例如。 select e from Employee left join fetch e.department where ...




  • LLP,Andrea


    I have two tables related together using one-to-many relation : employee -> department : and relation through department_id in the employee table.

    I use hibernate : and my hibernate mapping files are:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping default-lazy="false">
     <class catalog="moi"
      name="com.ebla.moi.correspondence.model.entity.user.User" table="user">
      <id name="id" type="java.lang.Long">
       <column name="id"/>
       <generator class="identity"/>
      </id>
      <many-to-one
       class="com.ebla.moi.correspondence.model.entity.department.Department"
       fetch="select" name="department">
       <column name="department_id"/>
      </many-to-one>
      <property generated="never" lazy="false" name="name" type="java.lang.String">
       <column length="128" name="name" not-null="true"/>
      </property>
      <property generated="never" lazy="false" name="email" type="java.lang.String">
       <column length="128" name="email" not-null="true" unique="true"/>
      </property>
      <property generated="never" lazy="false" name="maritalStatus" type="java.lang.Short">
       <column name="marital_status" not-null="true"/>
      </property>
      <property generated="never" lazy="false" name="hireDate" type="java.lang.String">
       <column length="64" name="hire_date"/>
      </property>
     </class>
    </hibernate-mapping>
    

    and the second mapping file is :

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping default-lazy="false">
     <class catalog="moi"
      name="com.ebla.moi.correspondence.model.entity.department.Department" table="department">
      <id name="id" type="java.lang.Long">
       <column name="id"/>
       <generator class="identity"/>
      </id>
      <property generated="never" lazy="false" name="name" type="java.lang.String">
       <column length="256" name="name" unique="true"/>
      </property>
      <set inverse="true" name="users" sort="unsorted">
       <key>
        <column name="department_id"/>
       </key>
       <one-to-many class="com.ebla.moi.correspondence.model.entity.user.User"/>
      </set>
     </class>
    </hibernate-mapping>
    

    My problem is : sometimes i need to get the employee with his department, and other times i need only the employee information with out department information..... and the same thing with department with employee.... using the mapping file above the hibernate bring the department and it's users if i need the employee or not... how to define my needs to hibernate to fetch just what i need...

    thank you

    解决方案

    You could map the relation as "lazy" and write two queries to get your datas:

    • The usual simple query to get your data ("lazy"). E.g. "select e from Employee e where ..."

    • The same query using "fetch join" to force Hibernate to fetch "childs". E.g. "select e from Employee left join fetch e.department where ..."

    LLP, Andrea

    这篇关于Hibernate在运行时更改获取模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆