1

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

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);

}

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

3 回答 3

0

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

  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 已经在识别(唯一,非空),则不需要在 key 中包含 parentid(FK 就足够了)。

于 2010-11-22T17:16:13.767 回答
0

...子映射中的内容是什么?它是否有机会声明一个名为 parent 的属性,该属性映射到 parentid 列?

于 2010-11-22T20:30:43.923 回答
0

正如汤姆安德森所说,你需要一个孩子到父母的多对一映射,并且可能在父母集映射上坚持 inverse=true 让休眠知道孩子管理这种关系。

于 2010-11-23T13:48:40.477 回答