有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我如何在Hibernate中映射多工单关联,其中子级有一个复合键,而父级中的一部分是主键?

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

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

共 (3) 个答案

  1. # 1 楼答案

    正如Tom Anderson所说,您需要在子对象到父对象之间进行多对一映射,或者在父对象集映射上使用inverse=true,让hibernate知道子对象管理关系

  2. # 2 楼答案

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