2012-04-23 61 views
15

之前保存的瞬态的实例我有两个实体: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 

任何想法我怎么能解决这个

感谢

回答

20

每当您尝试保存对象而没有保存相应的连接时,都会出现TransientObjectException。您必须sav首先UserInfoEntity,然后你可以保存你的PlayerInfoEntity类。

player.setUserId(new UserInfoEntity()); 

利用这一点,你要分配特别UserInfoEntityPlayerInfoEntity。但UserInfoEntity没有任何ID。两者如何被映射?这就是例外即将到来的原因。

希望它能帮助你。

+0

谢谢,你能指导我如何保存userInfoEntity – user1226162 2012-04-23 13:25:44

2

您应该使用CascadeType.PERSIST或CascadeType.ALL

+0

谢谢,但我已经使用CascadeType.ALL,在我的问题中提到,并得到错误:无法添加或更新子行:外键约束失败,任何想法 – user1226162 2012-04-23 10:13:58

+0

对不起,没有' t最后看到注释。但我认为,我们应该专注于您使用CascadeType.ALL获得的错误。 – 2012-04-23 10:31:57

+0

您显示了一条涉及'Criteria'的行,但它与您的代码无关。另一方面,它缺少重要的代码来组装你将要保存的'Player'。另外,这一行让我困惑:'player.getUserId()。setAddress(user.getUserId()。getAddress())'那有什么意义?那么UserId是一个复合对象? – 2012-04-23 10:37:39

-1

好,

我有simmilar问题,我所做的就是

Object tmp = session.get(Object.class,ob.getId()) 
if(tmp!=null){ 
    session.evit(tmp); // or merge 
} 
session.saveOrUpdate(ob); 

这为我工作。

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

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

+1

你需要解释更多关于这个解决方案。如何拯救解决这个问题。通常,这个问题是由于*不*保存附加到正在保存的当前实体的实体引起的。 – 2012-04-23 17:18:25

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(); 
} 
0

当试图通过Session#save()方法存储具有指定ID的未保存对象时,我刚才遇到了同样的错误。我认为问题可能是您的未保存的对象图已经被赋予了一个id(这是save-method试图做的事情),并且这不知何故地搅乱了save-method的级联。尝试使用Session#persist()代替,即使对象已经被分配了一个id,级联也应该与此一起工作。