有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

检测到预设ID为“分离实体”的java新实体

我有一个具有此ID定义的实体Player

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

但是,有时(但并非总是)我希望使用预设ID创建一个新实例

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

这显然会导致Hibernate将其视为分离的实体,从而引发异常

org.hibernate.PersistentObjectException: detached entity passed to persist

我怎样才能避免这种情况


共 (2) 个答案

  1. # 1 楼答案

    我可以删除@GeneratedValue并自己生成ID,比如:

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

    对于事务来说,这应该是安全的,但它不如让数据库来处理它

  2. # 2 楼答案

    那里有点不对劲。你能告诉我们你为什么要固定身份证吗? 因为你实际上是在说“请为我创建一个ID,我从来都不想处理这个问题”,所以你有时试图自己设置一个ID,这可能意味着你正在破坏整个事情

    该异常可能是因为您正在设置已使用的ID。然后,当尝试持久化时,hibernate检测到它与数据库中的内容不同步(分离),所以他只是抛出该异常