object引用未保存的瞬态实例:在刷新之前保存瞬态实例

时间:2012-04-23 09:39:41

标签: java hibernate

我有两个实体: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

知道如何解决这个问题

谢谢

6 个答案:

答案 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);

这对我有用。

它获取瞬态对象并将其驱逐或合并。

现在使用保存或更新方法保存新对象。