hibernate为不同的列使用两个外键?

时间:2010-11-03 17:00:39

标签: java hibernate orm

是否可以映射链接到同一个表的两个外键?它最好的我告诉你我的意思。

我有一个名为fixtures的表,目前看起来像这样:

<class name="" table="">
    <id name="id" column="id">
        <generator class="Increment" />
    </id>
    <property name="date" type="" column="" />
    <property name="" type="" column="" />
    <many-to-one name="awayTeam" column="teamId" not-null="true" />
    <many-to-one name="homeTeam" column="teamId" not-null="true" />
</class>

我还有一个名为Teams的桌子,用于保存球队的数据。

<class name="" table="">
    <id name="teamId" column="id">
        <generator class="Increment" />
    </id>
    <property name="name" type="String" column="name" />
    <property name="fixturesUrl" type="String" column="fixturesUrl" />
    <property name="rssNewsUrl" type="String" column="rssNewsUrl" />
</class>

在一场比赛/比赛中,每场比赛都有两支球队,一支客场球队和一支主场球队,我希望它能够与我的球队桌面进行一对多的关联。在休眠中有可能吗?如果是这样,怎么样?我的代码中缺少什么?

他们也是一种方式来说每个夹具记录不能让相同的球队互相比赛,即离开,主队必须是独一无二的吗?

提前欢呼

1 个答案:

答案 0 :(得分:4)

  

是否可以映射链接到同一个表的两个外键?

是。你有什么应该工作。如果没有,请解释问题。

  

他们也是一种方式来说每个夹具记录不能让相同的球队互相比赛,即离开,主队必须是独一无二的吗?

使用properties元素应该可行。来自文档:

  

5.1.16。 Properties

     

<properties>元素允许   命名,逻辑的定义   对类的属性进行分组。   最重要的用途   构造是它允许的   属性的组合是   属性的目标 - 参考。 它也是一个   方便的方式来定义   多列唯一约束

有关详细信息,另请参阅此previous question


更新:我不知道为什么但我无法获得使用<properties>元素生成的唯一密钥(也许我误用了它,我没有尝试太长时间)但这是一个使用<natural-id>元素的解决方案。

团队的映射:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="com.stackoverflow.q4089539.Team" table="TEAM">
    <id name="id" type="java.lang.Long">
      <column name="ID" />
      <generator class="native" />
    </id>
    <property name="name" type="java.lang.String">
      <column name="NAME" />
    </property>
    <property name="fixturesUrl" type="java.lang.String">
      <column name="FIXTURESURL" />
    </property>
    <property name="rssNewsUrl" type="java.lang.String">
      <column name="RSSNEWSURL" />
    </property>
  </class>
</hibernate-mapping>

和夹具:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="com.stackoverflow.q4089539.Fixture" table="FIXTURE">
    <id name="id" type="java.lang.Long">
      <column name="ID" />
      <generator class="native" />
    </id>
    <natural-id mutable="false">
      <many-to-one class="com.stackoverflow.q4089539.Team" name="awayTeam" not-null="true">
        <column name="AWAYTEAM"/>
      </many-to-one>
      <many-to-one class="com.stackoverflow.q4089539.Team" name="homeTeam" not-null="true">
        <column name="HOMETEAM" />
      </many-to-one>
    </natural-id>
    <property generated="never" lazy="false" name="date" type="java.util.Date">
      <column name="DATE" />
    </property>
  </class>
</hibernate-mapping>

这是生成的DDL:

create table FIXTURE (
    ID bigint not null,
    AWAYTEAM bigint not null,
    HOMETEAM bigint not null,
    DATE timestamp,
    primary key (ID),
    unique (AWAYTEAM, HOMETEAM)
)

create table TEAM (
    ID bigint not null,
    NAME varchar(255),
    FIXTURESURL varchar(255),
    RSSNEWSURL varchar(255),
    primary key (ID)
)

alter table FIXTURE 
    add constraint FKF88585E9445D9A98 
    foreign key (AWAYTEAM) 
    references TEAM

alter table FIXTURE 
    add constraint FKF88585E987B44C09 
    foreign key (HOMETEAM) 
    references TEAM