16

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

知道我该如何解决这个问题

谢谢

4

6 回答 6

21

TransientObjectException每当您尝试保存对象而不保存适当的联接时,就会出现这种情况。您必须先保存,UserInfoEntity然后才能保存您的PlayerInfoEntity课程。

player.setUserId(new UserInfoEntity());

通过使用它,您将特定分配UserInfoEntityPlayerInfoEntity. 但UserInfoEntity没有任何身份证。两者将如何映射?这就是异常到来的原因。

希望它会帮助你。

于 2012-04-23T10:16:28.933 回答
2

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

于 2012-04-23T09:49:05.087 回答
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();
}
于 2012-04-24T17:58:57.140 回答
0

刚才我在尝试通过 Session#save() 方法存储具有分配 ID 的未保存对象时遇到了同样的错误。我认为问题可能是您未保存的对象图已经被赋予了一个 id(这是保存方法试图做的事情),这以某种方式弄乱了保存方法的级联。尝试使用 Session#persist() 代替,级联应该可以使用它,即使对象已经被分配了一个 ID。

于 2012-09-06T08:24:37.930 回答
0

我遇到了同样的问题,经过大量调试后,我发现从实体中删除 @AllArgsConstructor 并添加

@Tolerate
public <ClassName>() {
}

为我工作。

于 2020-06-12T03:26:23.993 回答
-1

好,

我有类似的问题,我所做的是

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

这对我有用。

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

现在使用 save 或 update 方法来保存你的新对象。

于 2012-04-23T10:20:40.447 回答