16

PlayerProfileEntity と UserInfoEntity の 2 つのエンティティがあります。 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());

これを使用することで、に特定のものを割り当てUserInfoEntityていますPlayerInfoEntity。しかしUserInfoEntity、IDはありません。両方ともどのようにマッピングされますか? それが例外が来ている理由です。

それがあなたを助けることを願っています。

于 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 に答える
-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 に答える