Hibernate在运行时更改获取模式

时间:2009-02-02 11:27:30

标签: hibernate mapping

我有两个表使用一对多关系相关联:   员工 - > department:和employee表中的department_id之间的关系。

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

<?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>

,第二个映射文件是:

<?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>

我的问题是:有时我需要让他的员工和他的部门一起工作,有时我只需要员工信息,而不需要部门信息.....和部门与员工一样......使用hibernate上面的映射文件带来了部门和它的用户,如果我需要的是员工......如何定义我需要休眠来获取我需要的东西......

谢谢

4 个答案:

答案 0 :(得分:10)

您可以将关系映射为“lazy”并编写两个查询来获取数据:

  • 获取数据的常见简单查询(“懒惰”)。例如。 “从员工e中选择e ......”

  • 使用“fetch join”强制Hibernate获取“childs”的相同查询。例如。 “从员工中选择e离开联接获取e.department ......”

LLP,Andrea

答案 1 :(得分:8)

您可以使用ICriteria来获取您的员工。

您可以使用ICriteria的SetFetchMode方法来确定是否应该提取部门:

这将确保不提取部门:

ICriteria crit = theSession.CreateCriteria (typeof(Employee));
crit.SetFetchMode ("Department", FetchMode.Lazy)

使用此代码,将获取部门。

ICriteria crit = theSession.CreateCriteria (typeof(Employee));
crit.SetFetchMode ("Department", FetchMode.Join)

有人说最好的做法是在映射中使用默认的fetchmode(我猜这会很懒),并在每个特定场景中指定fetch-mode。 (也就是说,在您的存储库中)。

答案 2 :(得分:2)

这样做的一种方法是让两个类代表一个员工:

  • Employee,其中包含部门信息;
  • EmployeeSummary,其中只包含员工数据。

然后这两个类都在employee表上有独立的绑定,但只有Employee的关系也定义为department

然后,如果您需要加载Employee个实例的所有信息,并且只需要员工信息,则需要加载EmployeeSummary个实例。

您可以通过向两个员工类引入公共超类AbstractEmployee来删除任何重复的ORM绑定和业务逻辑。

答案 3 :(得分:1)