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 回答