我有一个(遗留的)表结构,看起来有点像这样:
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似乎为空。由于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
发布于 2010-11-22 17:16:14
我认为你有两个问题:
PS:如果childid已经在识别(唯一的,非空的),就不需要在key中有parentid (FK就足够了)。
发布于 2010-11-22 20:30:44
子映射的...
中有什么?它是否偶然声明了一个映射到parentid列的名为parent的属性?
发布于 2010-11-23 13:48:40
正如Tom Anderson所说,您需要子对象到父对象的多对一映射,也许还需要将inverse=true放在父对象集映射上,以便hibernate知道子对象管理关系。
https://stackoverflow.com/questions/4224885
复制相似问题