我有一个(旧)表结构,看起来有点像这样:

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

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


也就是说,子级主键的一部分是父级的主键。我试图这样映射(我们使用基于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);

}


更新:
我使用了错误的关系类型(已更新),但是现在我遇到了另一个问题:似乎在表中创建子行时,parentid为null。由于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

最佳答案

我认为您在这里有两个问题:


应该在MyChild类中声明多对一(如果我理解正确的话)。
当将@JoinColumn批注与复合键一起使用时,referencedColumnName是必需的。也许这也适用于XML ...?见http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships


PS:如果childid已经可以识别(唯一,非null),则无需在密钥中包含parentid(FK就足够了)。

08-16 18:37