2

我在数据库中有两个表,A 和 B。表 B 有一个由两个字段组成的 id。其中之一是 A 的外键。 A 的 ID 在插入时由序列自动生成。

A:
    ID (PK)
    (*other fields*)

B:
    SOME_FIELD (PK)
    A_ID (PK, FK to A)

我已经按照JPA 规范映射了 JPA (Hibernate) 中的两个表,以这种方式:

@Entity
@Table(name = "A")
public class A implements Serializable {
    @Id
    @SequenceGenerator(name = "A_SEQ", sequenceName = "A_SEQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "A_SEQ")
    @Column(name = "ID")
    private Long id;
  (...)
}

@Entity
@Table(name = "B")
public class B implements Serializable {
    @EmbeddedId
    @AttributeOverride(name = "someField", column = @Column(name = SOME_FIELD))
    private BPK pk;

    @MapsId("aId")
    @ManyToOne
    @JoinColumn(name = "A_ID")
    private A a;
  (...)
}

@Embeddable
public class BPK implements Serializable {
    private Long aId;
    private String someField;

    @Override
    public boolean equals(Object o) {
        (...)
    }

    @Override
    public boolean hashCode() {
        (...)
    }

    (...)
}

问题是,当我尝试保存调用 entityManager.persist(b) 的 B 对象时,其中 ba 设置为 A 对象,该对象已存在于数据库中,我得到一个异常:

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: package.name.A

我不知道为什么会这样。我正在尝试保存 B 类的对象,而不是 A。我的实体类错了吗?或者我不应该在这里使用持久化?

4

1 回答 1

3

可能是实体 A 不再由实体经理持有。您是否尝试使用 A 的“新鲜”实例设置 Ba?

b.setA(get(b.a));
entityManager.persist(b);

get(b.a)方法可以是您通常用来从数据源中查找实体 A 的任何方法,例如entityManager.getReference(A.class, a.id);

于 2013-08-23T10:09:21.743 回答