hibernate:如何在xml中创建复合外键?

时间:2012-11-24 12:30:42

标签: java hibernate hibernate-mapping

我有一个包含复合主键的类Event(开始日期和结束日期)。

EventPlanning类拥有Set个此类Event个对象,并且必须使用带有XML的hibernate来持久保存它们。 我可以为具有公共主键的类执行此操作:

<!-- EventPlanning xml -->
....
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name" type="string" update="false" />

<set name="events" table="events" cascade="all">
    <key column="event_id">   // ###### here! ######
    </key>
    <one-to-many class="myPackage.Event" />
</set>
...

但我无法了解它如何与复合键一起使用..

使用以下代码替换<key column="event_id">不起作用:

<key>
    <property column="start_date" />
    <property column="end_date" />
</key>

如果有人能告诉我正确的语法,我会很高兴的! :)

Event xml如下所示:

<class name="myPackage.Even" table="events">

        <composite-id>
            <key-property name="startDate" column="start_date" type="date" />
            <key-property name="endDate" column="end_date" type="date" />
        </composite-id>

        <property name="signinDeadline" column="signin_deadline"
            type="date" />
        <property name="confirmationDeadline" column="confirmation_deadline"
            type="date" />

        <set name="participants" table="participants" cascade="all">
            <key column="event_id">
            </key>
            <one-to-many class="myPackage.Participants" />
        </set>

    </class>
提前谢谢! :)

2 个答案:

答案 0 :(得分:0)

这样的事情对我有用:

<class name="YourClass" table="your_table" ...>
  <composite-id name="compositeId" class="DoubleDate">
     <key-property name="start_date" column="start_date"/>
     <key-property name="end_date" column="end_date"/>
  </composite-id>
  ...
 </class>

public class DoubleDate implements Serializable {
   private Date start_date, end_date;
   public DoubleDate() {
   }
   // setters, getters
}

public class YourClass {
   private DoubleDate compositeId;
   // public no args ctr, getters, setters, etc
}

答案 1 :(得分:0)

现在用JPA和Hibernate工作了更长时间后,我只是说你不应该使用复合主键。缓存使用id作为指向缓存值的键,数据检索方法如getload期望id作为参数等。 拥有一个id字段可以获得所需的额外空间。