是否可以映射链接到同一个表的两个外键?它最好的我告诉你我的意思。
我有一个名为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>
在一场比赛/比赛中,每场比赛都有两支球队,一支客场球队和一支主场球队,我希望它能够与我的球队桌面进行一对多的关联。在休眠中有可能吗?如果是这样,怎么样?我的代码中缺少什么?
他们也是一种方式来说每个夹具记录不能让相同的球队互相比赛,即离开,主队必须是独一无二的吗?
提前欢呼
答案 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