Как мне сопоставить многозначную ассоциацию в Hibernate, где у ребенка есть составной ключ, и часть этого является первичным ключом в родительском? - PullRequest
1 голос
/ 19 ноября 2010

У меня есть (устаревшая) структура таблицы, которая выглядит примерно так:

table parent (
  parentid int (PK)
  ...
)

table child (
  parentid int (PK)
  childid int (PK)
  ...
)

То есть часть первичного ключа child является первичным ключом parent. Я попытался отобразить это (мы используем основанный на XML Hibernate), как это:

<hibernate-mapping>
<class name="com.example.MyParent" table="parent">

    <id name="parentid" column="parentid" unsaved-value="0" >
        <generator class="identity"/>
    </id>

    <set name="children" cascade="all">
        <key>
            <column name="parentid"/>
        </key>
        <one-to-many class="com.example.MyChild" />
    </set>
...
</class>

<class name="com.example.MyChild" table="child">
    <composite-id name="id" class="com.example.MyChildId">
        <key-property name="parentid" column="parentid" />
        <key-property name="childid" column="childid" />
    </composite-id>
    ...
</class>

Java класс:

public void updateParent(MyParent param) {
    ht.saveOrUpdate(param);

}

UPDATE: Я использовал неправильный тип отношения (обновлено), но теперь у меня есть другая проблема: создается впечатление, что при создании дочерних строк в таблице парентида равна нулю. Поскольку parentid является частью составного ключа, вставка невозможна.

Из журнала:

DEBUG SQL - insert into Child(PARENTID, CHILDID) values (?, ?)
TRACE IntegerType - binding null to parameter: 1
TRACE IntegerType - binding '5678' to parameter: 2
WARN  JDBCExceptionReporter - SQL Error: -10, SQLState: 23502
ERROR JDBCExceptionReporter - integrity constraint violation: NOT NULL check constraint;     SYS_CT_10028 table: Child

Ответы [ 3 ]

0 голосов
/ 22 ноября 2010

Что находится в ... в дочернем отображении? Случайно ли он объявляет свойство с именем parent, которое сопоставляется со столбцом parentid?

0 голосов
/ 23 ноября 2010

Как говорит Том Андерсон, вам понадобится сопоставление «многие-к-одному» дочернего элемента к родительскому элементу и, возможно, указание обратного = true в отображении родительского набора, чтобы hibernate знал, что дочерний элемент управляет отношениями.

0 голосов
/ 22 ноября 2010

Я думаю, что у вас есть две проблемы здесь:

  1. Многие-к-одному должны быть объявлены в классе MyChild (если я правильно понимаю).
  2. При использовании аннотации @JoinColumn с составными ключами referencedColumnName является обязательным. Может быть, это относится и к XML ...? Смотри http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

PS: если childid уже идентифицирует (уникальный, не нулевой), нет необходимости иметь парентид в ключе (достаточно FK).

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