我看了很多关于这个主题的帖子,但一直无法解决它=(
我正在尝试保存具有一对多关系的父级及其子级。我相信我正在遵循其他帖子中的留档和其他建议。然而,我遇到的问题是,当Hibernate尝试保存子记录时,它在父级中插入FK的“0”,而不是真正的id。
父hbm。xml映射
<hibernate-mapping>
<class name="ParentClass" table="PARENTTABLE">
<id name="parentid" type="java.lang.Long">
<column name="PARENTID" precision="15" scale="0" />
<generator class="sequence">
<param name="sequence">S_PARENTTABLE</param>
</generator>
</id>
...
<set name="children" table="CHILDTABLE" inverse="true" lazy="true" fetch="select" cascade="all">
<key>
<column name="PARENTID" precision="15" scale="0" not-null="true" />
</key>
<one-to-many class="ParentClass" />
</set>
...
</class>
</hibernate-mapping>
孩子hbm。xml映射
<hibernate-mapping>
<class name="ChildClass" table="CHILDTABLE">
<composite-id name="id" class="ChildClassId">
....
<key-property name="parentid" type="long">
<column name="PARENTID" precision="15" scale="0" />
</key-property>
</composite-id>
<many-to-one name="parent" class="ParentClass" update="false" insert="false" fetch="select">
<column name="PARENTID" precision="15" scale="0" not-null="true" />
</many-to-one>
....
</class>
</hibernate-mapping>
保存对象的Java代码
private myMethod(ParentClass p, HashSet<ChildClass> children){
for(ChildClass child : children){
child.setParent(p);
}
p.setChildren(children); //The parameter type is Set<ChildClass>
sess.save(p);
...
}
因此,它将用正确的id(下一个seq值,比如273)保存父对象,但当它去尝试保存子对象时,而不是使用273,它只是使用0。
我不知道如何让Hibernate用正确的ParentId(FK)保存子对象。
您能提供的任何帮助或任何想法将不胜感激!提前感谢!
**UPDATE**我终于弄清楚为什么子表中的FK没有用正确的值插入。这是由于映射定义。我在数据库上运行了逆向工程,我选中了一个写着“生成基本类型的复合ID”的框。这导致Hibernate将复合键列映射为原始类型,而不是对实体的引用。当我进行插入时,这在某种程度上混淆了它。
正确的子表映射应该更像这样:
更新了子hbm。xml映射
<hibernate-mapping>
<class name="ChildClass" table="CHILDTABLE">
<composite-id name="id" class="ChildClassId">
....
<key-many-to-one name="parentid" class="ParentClass" >
<column name="PARENTID" precision="15" scale="0" />
</key-many-to-one>
</composite-id>
</class>
</hibernate-mapping>
请注意标记,而不是之前的标记。此外,外部的标记也消失了(或者作为标记移动到id中)。
我认为在你们的例子中,你们应该在父类的一对多映射定义中将逆属性设置为false。这意味着您的父实体将负责更新子表中的FK。在这种情况下,Hibernte将在保存父实体后执行额外的update语句来更新子表中的FK。
<set name="children" inverse="false" lazy="true" fetch="select" cascade="all">
<key>
<column name="PARENTID" precision="15" scale="0" not-null="true" />
</key>
<one-to-many class="ParentClass" />
</set>
当我读到cascade和inverse时,有人说它们都在做完全不同的事情。级联:在级联中,在一个操作(保存、更新和删除)完成后,它决定是否需要调用其他操作(保存、更新和删除)对其他相互有关系的实体。反向:这用于决定哪一方是管理关系的关系所有者(插入或更新外键列)。 假设我保存有一些孩子的父级。所以当我一方面用inverse="true"cascade="all"设置一对多时,我希望孩子是关系的所有
我使用的是Spring数据jpa。将子实体添加到父实体后,我将父实体保存到数据库。我想得到孩子的身份证,但我发现我得到的是空的。 我在getId()方法中添加了@GeneratedValue(Strategy=GenerationType.IDENTITY),但它不起作用。 以下是模型: 父实体已经在数据库中,所以我直接找到它,父存储库entends Jpa列举 这里是我的测试代码: 我得到的输出
我以这种方式在实体结构中使用Joined Hibernate继承映射: 我想先保存一个用户,然后在另一个api中保存一个客户,并将该客户映射到第一个用户。所以我尝试用现有的用户id保存一个新客户: 但是,hibernate使用新生成的id(而不是固定传递的id)生成客户,并生成一个新用户。我的问题是:我怎样才能在孩子的父母之后救他?还是反正又有没有救孩子不救父母?
环境:Spring 4.0.3,spring-data-jpa 1.2.0,Hibernate 4.2.10,jackson 2.3.3,lombok 1.12.6, 科目实体(已编辑) 用户实体(已编辑) 事务管理器(编辑)
Suppose we loaded up a Parent in one Session, made some changes in a UI action and wanted to persist these changes in a new session by calling update(). The Parent will contain a collection of childre
假设我有一个应用程序来处理一系列的书。 我的应用程序允许向库中添加新书。创建书籍时,用户可以在列表中选择作者,如果作者尚不存在,则可以将其添加到列表中,并在表单字段中提供其姓名。填写表单后,数据将发送到WS,类似 然后我将json映射到我的实体中 书: 作者 这不会像用户尝试添加新作者一样工作,当我尝试. sav()时,我会收到错误: 组织。冬眠TransientPropertyValueExce