Как указать внешний ключ в отношении «многие к одному», если это не свойство самого объекта? - PullRequest
1 голос
/ 26 апреля 2010

Я пытаюсь отобразить отношения «многие к одному» между MarketMenuBranch и Market. Мои занятия выглядят так:

public class Market implements Serializable {
    private int id;
    private String name;
    private List<MarketMenuBranch> marketMenuBranches;
    // accessors / mutators etc...

public class MarketMenuBranch implements Serializable {
    private MarketMenuBranchId id;
    private String name;
    // accessors / mutators etc...

public class MarketMenuBranchId implements Serializable {
    private int marketId;
    private int sequence;
   // accessors / mutators etc...

Но я не знаю, что я могу указать для названия объекта (где у меня есть ????). Я действительно хочу поставить id.marketId, но, похоже, это неправильно.

<class name="MarketMenuBranch" table="MARKET_MENU_BRANCH">
    <composite-id name="id" class="MarketMenuBranchId">
        <key-property name="marketId"/>
        <key-property name="sequence"/>
    </composite-id>
    <property name="name"/>
    <many-to-one name="????????"/>
</class>

Как я могу это сделать?

РЕДАКТИРОВАТЬ: Вот отображение рынка:

<class name="Market" table="MARKET">
    <id name="id"/>
    <property name="name"/>
    <list name="marketMenuBranches" inverse="true" cascade="all-delete-orphan">
        <key column="marketId"/>
        <list-index column="sequence"/>
        <one-to-many class="MarketMenuBranch"/>
    </list>
</class>

и вот мои таблицы:

mysql> describe MARKET;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | NULL    |       | 
| name  | varchar(100) | YES  |     | NULL    |       | 
+-------+--------------+------+-----+---------+-------+

mysql> describe MARKET_MENU_BRANCH;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| marketId | int(11)      | NO   | PRI | 0       |       | 
| sequence | int(11)      | NO   | PRI | 0       |       | 
| name     | varchar(100) | YES  |     | NULL    |       | 
+----------+--------------+------+-----+---------+-------+

Ответы [ 3 ]

1 голос
/ 27 апреля 2010

Что-то идет не так, потому что более одного свойства совместно используют один и тот же столбец. Ваш MarketMenuBranch должен выглядеть следующим образом (Обратите внимание: insert = "false", update = "false")

<class name="MarketMenuBranch" table="MARKET_MENU_BRANCH">
    <composite-id name="id" class="MarketMenuBranchId">
        <!--Ops... A property whose mapped column is called marketId-->
        <key-property name="marketId"/>
        <key-property name="sequence"/>
    </composite-id>
    <property name="name"/>
    <!--Ops... Other property whose mapped column is called marketId-->
    <many-to-one name="market" column="marketId" insert="false" update="false"/>
</class>

Hibernate спросит вас: какое свойство я должен сохранить / обновить ???

Из-за этого вы должны определить insert = "false", update = "false"

Вы новый Hibernate парень ???

Имейте это в виду: Hibernate не поддерживает автоматическое создание составного первичного ключа

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

0 голосов
/ 27 апреля 2010

Возможно, вам следует отобразить MarketMenuBranch в виде списка составных элементов:

<class name="Market" table="MARKET">
    ...
    <list cascade="all-delete-orphan" name="marketMenuBranches" table="MARKET_MENU_BRANCH">
      <key column="MARKET_ID"/>
      <list-index column="SEQUENCE"/>
      <composite-element class="MarketMenuBranch">
        <property column="NAME" name="name"/>
      </composite-element>
    </list>
0 голосов
/ 27 апреля 2010

ну, я думаю, вам не следует называть свой идентификатор члена данных в MarketMenuBranch, поскольку это немного сбивает с толку. Я бы порекомендовал marketMenuBranch. Вот что это правильно?

Но если исходить из того, что у вас есть выше, вы просто ссылаетесь на имя участника класса, на которого вы ссылаетесь. Итак:

<many-to-one name="id" column="column_name" class="MarketMenuBranchId"/>

Вы просто указываете контейнерный объект, который вы создали и используете в качестве члена класса. MarketMenuBranchId также должен отображаться, и Hibernate будет знать, как получить идентификатор, и поэтому вам не нужно указывать id.marketId.

Кстати: я понятия не имею, правильна ли вся структура (это зависит от вас), но это должно ответить на ваш конкретный вопрос. Мне кажется, что ваш способ вызова XXXId немного вводит в заблуждение, но вы знаете свои потребности лучше, чем я.

edit: Я также хотел бы отметить, что если у вас вообще есть контроль над БД, я бы рекомендовал не использовать составные идентификаторы. В будущем все станет немного громоздко. И сгенерированный системой идентификатор лучше следует правилам нормализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...