我有两个实体:PlayerProfileEntity和UserInfoEntity。我在userInfoEntity和PlaterProfileEntity上进行联接,并将记录保存在数据库中:
Session session = sessionFactory.openSession();
Transaction tr = session.beginTransaction();
Criteria crit = session.createCriteria(PlayerProfileEntity.class);
player.setUserId(new UserInfoEntity());
player.getUserId().setAddress(user.getUserId().getAddress());
session.save(player);
tr.commit();
我在我的PlayerProfileEntity类中使用了这个关联。
@ManyToOne (fetch = FetchType.LAZY)
@Cascade({CascadeType.REFRESH})
@JoinColumn(name="userid")
我收到了这个错误:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.shared.entity.UserInfoEntity
注意:如果我使用CascadeType.All,会出现以下错误:
Cannot add or update a child row: a foreign key constraint fails
你有任何想法如何解决这个问题吗?
谢谢。
Criteria
的代码行,但它与你的代码无关。另一方面,缺少重要的代码来组装你要保存的Player
。此外,这行代码让我感到困惑:player.getUserId().setAddress(user.getUserId().getAddress())
。这是什么意思?而且为什么UserId是一个复合对象? - Marko Topolnikuser
是一个持久化对象,那么他的address
也是持久化的。你将该地址设置为非持久化对象player
。这可能是你问题的原因。 - Marko Topolniksession.save(o)
时,它会在保存之前隐式地执行session.persist(o)
。你也可以自己调用它。此时,Hibernate将“注意到”你的对象并将其注册到会话中。 - Marko Topolnik