gpt4 book ai didi

java - 帮助理解 hibernate 行为/错误

转载 作者:行者123 更新时间:2023-11-29 03:58:16 25 4
gpt4 key购买 nike

我有一个 Product 类,它与自身具有一对多关联(复合模式)。下面分别是pojo、hbm、测试代码和日志/错误。有人可以解释这个错误是什么。为什么在设置父项的主键时会出现此错误?

产品展示

public class Product
{
private Long id;

private Set<Product> children = Collections.emptySet();

public void addChild(final Product child)
{
if (children.isEmpty())
{
children = Sets.newHashSet();
}
child.setParent(this);
children.add(child);
}
}

hbm.xml

<class name="Product" table="PRODUCT">
<set name="children" lazy="false" table="PRODUCT">
<key>
<column name="ID" />
</key>
<one-to-many class="Product" />
</set>
</class>

测试

public void save()
{
// Level 1 - mortgage LOB
Product mortgage = new Product();
mortgage.setCode("Mortgage");

Product ml = new Product();
ml.setCode("Mortgage Loan");

Product me = new Product();
me.setCode("Home Equity LOC");

//Level 2
mortgage.addChild(ml);
mortgage.addChild(me);

hibernateTemplate.save(mortgage);
}

日志和错误

DEBUG [org.hibernate.SQL] insert into PRODUCT (ID, CODE, NAME, STARTDATE, ENDDATE, ISDECISIONABLE, ISSELECTABLE) values (null, ?, ?, ?, ?, ?, ?)
DEBUG [org.hibernate.type.StringType] binding 'Mortgage' to parameter: 1
DEBUG [org.hibernate.type.StringType] binding null to parameter: 2
DEBUG [org.hibernate.type.TimestampType] binding null to parameter: 3
DEBUG [org.hibernate.type.TimestampType] binding null to parameter: 4
DEBUG [org.hibernate.type.BooleanType] binding 'false' to parameter: 5
DEBUG [org.hibernate.type.BooleanType] binding 'false' to parameter: 6
DEBUG [org.hibernate.SQL] call identity()
DEBUG [org.hibernate.SQL] update PRODUCT set ID=? where ID=?
DEBUG [org.hibernate.type.LongType] binding '1' to parameter: 1
ERROR [org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.Product
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:78)

最佳答案

transient 对象是尚未保存的对象。正如映射的那样,您的关系不使用任何“传递持久性”,也就是说,您没有告诉 hibernate ,当您保存 parent 时,您想要保存 child 。我猜这个错误是因为你在父级(在 session 中)上有子级的实例(子级与父级具有相同的类无关紧要),并且 hibernate 知道这一点,但它不知道如何处理它们。

您可以:

1) 在保存 parent 之前先保存 child
2) 将 'cascade' 属性添加到您的映射中,例如 cascade="save"或 cascade="all"

参见 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-transitive

关于java - 帮助理解 hibernate 行为/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5099950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com