2

PlayerこのID定義のエンティティがあります

@Id
@GeneratedValue
@Column(updatable=false)
private long id;

ただし、(常にではありませんが)プリセットIDを使用して新しいインスタンスを作成したい場合があります。

player = new Player(...);
player.setId(externalId);
em.persist(player);

これにより、Hibernateはそれを分離されたエンティティと見なし、例外をスローするようです。

org.hibernate.PersistentObjectException:永続化するために渡されたデタッチされたエンティティ

どうすればこれを回避できますか?

4

2 に答える 2

1

次のように、を削除して@GeneratedValue自分でIDを生成できます。

begin transaction
if id not preset {
    do {
        id = random number
    } while (id in use)
}
create player with id
commit transaction

これはトランザクションでは安全なはずですが、データベースに処理させるよりも最適ではありません。

于 2012-05-03T09:45:10.533 に答える
0

そこには何か問題があります。固定 ID が必要な理由を教えてください。あなたは実際に「これに対処したくないIDを作成してください」と言っているので、IDを自分で設定しようとすることがあります。

その例外は、既に使用されている ID を設定していることが原因である可能性があります。次に、永続化しようとすると、hibernate は DB の内容と同期していない (切り離されている) ことを検出するため、その例外をスローします。

于 2012-05-03T09:36:55.750 に答える