如何在单个POJO中表示Hibernate对象的集合?

时间:2011-11-02 07:57:47

标签: java hibernate dao hibernate-mapping

考虑以下Hibernate映射:

<hibernate-mapping package="org.example">
  <class name="Customer" table="CUSTOMER">
    <id name="customerId" column="customer_id"/>

    <bag name="itineraries" table="ITINERARY" inverse="true" cascade="all">
      <key column="customer_id"/>
      <one-to-many class="Itinerary"/>
    </bag>

    <bag name="hotels" table="HOTEL" inverse="true" cascade="all">
      <key column="customer_id"/>
      <one-to-many class="Hotel"/>
    </bag>
  </class>
</hibernate-mapping>

<hibernate-mapping package="org.example">
    <class name="Itinerary" table="ITINERARY">
      <many-to-one name="customer" column="customer_id" update="false" not-null="true"/>
      ...other properties...
    </class>
</hibernate-mapping>

<hibernate-mapping package="org.example">
    <class name="Hotel" table="HOTEL">
      <many-to-one name="customer" column="customer_id" update="false" not-null="true"/>
      ...other properties...
    </class>
</hibernate-mapping>

现在说你需要删除CUSTOMER表。您将如何重构映射/模型,以便Customer Java对象继续包含基于customerId的行程列表和酒店对象?所说的酒店和行程对象仍然需要由Hibernate管理。

我能想到的最好的是客户对象在呼叫者请求列表时推迟到DAO。是否有更清洁的方法仍然允许Customer对象存在于每个行程和酒店对象中?

1 个答案:

答案 0 :(得分:0)

删除客户表后,客户对象将不再由Hibernate管理。如果您仍希望拥有包含行程和酒店的客户对象,则需要以编程方式完成。我不确定你是否真的在寻找这个。

这样做的一种可能方法是

  1. 假设你有一个方法getCustomer()的DAO。这接受了客户ID。
  2. 此方法会根据客户ID触发另外两个查询以获取行程和酒店列表。
  3. 创建一个Customer对象,并将行程和酒店列表设置到其中,并将其返回并填充客户对象。