Java 使用JPA重用同一密钥

Java 使用JPA重用同一密钥,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个包含EntityB列表的类EntityA @Entity public class EntityA { @Id private long id; @OneToMany(mappedBy = "entityAId", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) public final List<EntityB> listOfB = new A

我有一个包含EntityB列表的类EntityA

@Entity
public class EntityA {
    @Id
    private long id;

    @OneToMany(mappedBy = "entityAId", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    public final List<EntityB> listOfB = new ArrayList<>();

    ...
}

@Entity
public class EntityB {
    @Id
    private long entityAId;

    @Id
    private String name;

    private String value;
    ...
}
但是我得到了“javax.persistence.EntityExistsException:具有相同标识符值的不同对象已经与会话关联”
在EntityB中添加一个额外的唯一ID字段“修复”了这个问题,但我不希望在我的db中添加额外的列。有更好的方法吗?

为什么要这样做?如果要忽略唯一约束,请通过更改或删除它来修复唯一约束。设计类来建模它们的用途…EntityB包含键值对。数据库中一次只存在一个具有相同Id和名称的EntityB。我希望能够删除EntityB并在以后能够重用它(而不在两者之间持久化)。您将无法删除EntityB,因为您不需要对Hibernate的执行堆负责。有时,它会在删除旧实体之前插入新实体,引发此类异常。如果你真的不能重复使用同一个物体,那就很难了。即使你把它拆开以后再重新连接,我也不确定它是否能工作。(值得一试?)在执行过程中,“清除”后,现有的B仍在一级缓存(可能还有二级缓存)中。你必须刷新,然后逐出它们,这样就有可能创建一个新对象,其主键与先前删除的对象相同,或者你可以只更新现有对象!
EntityA myEntityA = entityManager.find(EntityA.class, 1);
// myEntityA.listOfB contains one element [entityAId = 1, name = "foo", value = "bar"]
myEntityA.listOfB.clear();
myEntityA.listOfB.add(new EntityB(1, "foo", "baz");
entityManager.persist(myEntityA);
// commit transaction here