1

假设我有 2 个 JPA 实体

@Entity
public class MyComplexEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private MyComplexEntityId id;
    private String text;

    public MyComplexEntity() {
    }

    public MyComplexEntity(String text) {
        this.text = text;
    }

    public MyComplexEntityId getId() {
        return id;
    }

    public void setId(MyComplexEntityId id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    @Override
    public String toString() {
        return "MyComplexEntity{" + "id=" + id + ", text=" + text + '}';
    }

}

@Embeddable
public class MyComplexEntityId {

    @Column
    private long id;

    public MyComplexEntityId(long id) {
        this.id = id;
    }

    public MyComplexEntityId() {
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "MyComplexEntityId{" + "id=" + id + '}';
    }

}

现在我正在尝试像这样持久化一个新的 MyComplexEntity 对象

MyComplexEntity entity = new MyComplexEntity("something");
em.persist(entity);
System.out.println(entity);

我得到的是:

MyComplexEntity{id=null, text=something}

为什么那里的 id 为空?如果我对原始主键类型做同样的事情,则在持久化后正确设置了 id。我还尝试了以下事情:

  1. 在坚持后调用em.flush();:什么都不做
  2. 在持久化之后调用em.refresh(entity);:异常告诉我实体不再在数据库中(这是错误的)
  3. 尝试em.merge()代替em.persist():与预期相同的结果
  4. 调用em.contains(entity);返回true,所以实体实际上是附加的
  5. em.persist();通过使用在单独的方法中执行它来将其放入单独的事务中@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

persist() 一定有某种问题;使用@EmbeddedId 时,但我就是不明白。

4

1 回答 1

0

您不能将 GeneratedValue(strategy = GenerationType.IDENTITY) 放在复杂的映射上。它需要进入 embeddedId 类,并且您需要为您的新实体实例化一个 MyComplexEntityId 实例。您还需要刷新到数据库以确保将值分配为插入分配的标识值。

于 2013-07-24T21:24:53.543 回答