один-ко-многим без внешнего ключа в спящем режиме - PullRequest
3 голосов
/ 23 января 2012

У меня 2 класса еды и дня. Один день может иметь несколько блюд, а один - несколько дней. Я храню объект Day со всеми приемами пищи за день. И объект Meal без атрибута типа Day. Код выглядит следующим образом:

public class Day {
Date date;
private Map<Meal, List<Integer>> mealsLines;

public Day() {
} ....
}


public class Meal implements java.io.Serializable {
private long id;
private String name;

public Meal() {
} ....


<hibernate-mapping>
<class name="data.Day" table="DAY">
    <id name="date" type="java.sql.Date" access="field">
        <column name="DATE" />
        <generator class="assigned" />
    </id>
    <map name="mealsLines" table="MEAL" lazy="true" access="field">
        <key>
            <column name="DATE" />
        </key>
        <map-key type="data.Meal"></map-key>
        <one-to-many class="data.Meal" />
    </map>
</class>
</hibernate-mapping>


<hibernate-mapping>
<class name="data.Meal" table="MEAL">
    <id name="id" type="long">
        <column name="ID" />
        <generator class="identity" />
    </id>
    <property name="name" type="java.lang.String" access="field">
        <column name="NAME" />
    </property>
</class>
</hibernate-mapping>

Итак, теперь с этими картами я получаю две таблицы:
Питание
ИМЯ ----> ДАТА <---- неправильно </p>

день
ДАТА

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

Ответы [ 2 ]

5 голосов
/ 23 января 2012

Вы не можете. Имея один прием пищи в течение многих дней и много приемов пищи в один день, вы должны иметь отношения многих ко многим.

Чтобы сделать это, вы должны иметь ассоциативную таблицу между таблицами Meal и Day.

По умолчанию Hibernate будет пытаться использовать внешние таблицы в таблицах, если это возможно, потому что это позволяет базе данных обеспечивать согласованность и корректность данных, а также часто быстрее из-за неявных индексов, которые большинство реляционных БД создают с внешними ключами.

4 голосов
/ 23 января 2012

То, что вы спрашиваете, является отношением один-ко-многим, а из вашего описания видно, что требуется отношение многие ко многим.Вы можете реализовать это путем создания другого класса / таблицы сопоставления, который будет отображать внешние ключи других двух таблиц.

MEAL
╔════════════╗
║ ID* | NAME ║
╠════════════╣
║ 1   | M1   ║
║ 2   | M2   ║
╚════════════╝

DAY
╔════════════╗
║ ID* | DESC ║
╠════════════╣
║ D1  | aa   ║
║ D2  | bb   ║
╚════════════╝

MEAL_DAY_MAPPING

╔══════════╦═════════╦══════════════════╗
║ MEAL_ID* ║ DAY_ID* ║ MEAL_DAY_DETAILS ║
╠══════════╬═════════╬══════════════════╣
║        1 ║ D1      ║ XXX              ║
║        1 ║ D2      ║ YYY              ║
║        2 ║ D1      ║ ZZZ              ║
╚══════════╩═════════╩══════════════════╝

* indicates PK

Ref

...