hibernate использовать два внешних ключа для разных столбцов? - PullRequest
4 голосов
/ 03 ноября 2010

возможно ли сопоставить два внешних ключа, связанных с одной и той же таблицей? Лучше всего я покажу тебе, что имею в виду.

У меня есть таблица с именем 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>

И у меня есть еще одна таблица под названием «Команды», в которой хранятся данные команд.

<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 Ответ

4 голосов
/ 03 ноября 2010

возможно ли сопоставить два внешних ключа, связанных с одной и той же таблицей?

Да. То, что у вас есть, должно работать. Если это не так, пожалуйста, объясните проблему.

Является ли их способ сказать, что в каждой записи о матче не может быть одинаковых команд, играющих друг с другом, то есть в гостях, и домашняя команда должна быть уникальной?

Это должно быть выполнено с использованием элемента properties. Из документации:

5.1.16. Свойства

Элемент <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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...