возможно ли сопоставить два внешних ключа, связанных с одной и той же таблицей?
Да. То, что у вас есть, должно работать. Если это не так, пожалуйста, объясните проблему.
Является ли их способ сказать, что в каждой записи о матче не может быть одинаковых команд, играющих друг с другом, то есть в гостях, и домашняя команда должна быть уникальной?
Это должно быть выполнено с использованием элемента properties
. Из документации:
Элемент <properties>
позволяет
определение именованного, логического
группировка свойств класса.
Наиболее важное использование
построить то, что это позволяет
сочетание свойств, чтобы быть
цель свойства-ref. Это также
удобный способ определить
уникальное ограничение для нескольких столбцов .
См. Также предыдущий вопрос для получения более подробной информации.
Обновление: Я не уверен, почему, но я не смог получить уникальный ключ, сгенерированный с использованием элемента <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