我有两个实体: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类中使用了这个assosiation
@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
知道如何解决这个问题
谢谢
答案 0 :(得分:20)
只要您尝试保存对象而不保存相应的联接,就会出现TransientObjectException
。您必须先保存UserInfoEntity
,然后才能保存PlayerInfoEntity
类。
player.setUserId(new UserInfoEntity());
通过使用此功能,您可以将特定UserInfoEntity
分配给PlayerInfoEntity
。但是UserInfoEntity
没有任何ID。如何映射?这就是异常即将到来的原因。
希望它会对你有所帮助。
答案 1 :(得分:2)
您应该使用CascadeType.PERSIST或CascadeType.ALL
答案 2 :(得分:1)
public void savePlayerMethod(PlayerInfoEntity player){
if(player == null){
player = new PlayerInfoEntity();
}
player.setUserId(getSavedUserInfo());
Session session = SessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(userInfo);
transaction.committ();
}
public UserInfoEntity getSavedUserInfo(){
UserInfoEntity userInfo = new UserInfoEntity();
Session session = SessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(userInfo);
transaction.committ();
}
答案 3 :(得分:0)
当我尝试通过Session#save()方法存储具有指定ID的未保存对象时,我刚刚遇到了同样的错误。我认为问题可能是你的未保存的对象图已经被赋予了一个id(这是save-method试图做的事情),并且这会以某种方式混淆save-method的级联。尝试使用Session#persist()代替,cascade应该使用它,即使已经为对象分配了id。
答案 4 :(得分:0)
我遇到了同样的问题,经过大量调试,我发现从实体中删除@AllArgsConstructor并添加
@Tolerate
public <ClassName>() {
}
为我工作。
答案 5 :(得分:-1)
好吧,
我有同样的问题,我做的是
Object tmp = session.get(Object.class,ob.getId())
if(tmp!=null){
session.evit(tmp); // or merge
}
session.saveOrUpdate(ob);
这对我有用。
它获取瞬态对象并将其驱逐或合并。
现在使用保存或更新方法保存新对象。