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

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

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

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

То есть часть первичного ключа дочернего элемента является первичным ключом для родительского элемента. Я попытался отобразить это (мы используем Hibernate на основе xml) следующим образом:

<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 class:

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

}

ОБНОВЛЕНИЕ: я использовал неправильный тип отношения (обновлен), но теперь у меня есть другая проблема: кажется, что при создании дочерних строк в таблице родительский элемент равен нулю. Поскольку парентид является частью составного ключа, вставить их не удастся.

Из журнала:

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

person mranders    schedule 19.11.2010    source источник


Ответы (3)


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

  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 было бы достаточно).

person Kawu    schedule 22.11.2010
comment
Спасибо. Я действительно использовал неправильное сопоставление, но это не решило мою проблему. - person mranders; 23.11.2010

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

person Tom Anderson    schedule 22.11.2010
comment
Нет, он не объявляет никаких родительских свойств в сопоставлении Child. - person mranders; 24.11.2010

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

person Derek Troy-West    schedule 23.11.2010
comment
Я этого не говорил. Ты уволен. - person Tom Anderson; 23.11.2010
comment
Нужно ли мне отображение «многие-к-одному» в ребенке, даже если мне нужны однонаправленные отношения? Дочерние объекты ничего не знают о своих родителях. - person mranders; 24.11.2010
comment
Да, в этом случае, потому что вы ссылаетесь на родителя (по крайней мере, на идентификатор) от дочернего элемента. - person Derek Troy-West; 28.11.2010
comment
Объявление маппинга многие-к-одному в потомке не помогло, все равно получаю ту же ошибку. - person mranders; 29.11.2010