持久化后,JPA EmbeddedId为null

时间:2013-07-24 19:58:08

标签: jpa eclipselink

假设我有2个JPA entites

@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为null?如果我使用原始主键类型执行相同操作,则在持久化后正确设置id。我也尝试了以下事项:

  1. 在持久性之后调用em.flush();:什么都不做
  2. 在persist之后调用em.refresh(entity);:异常告诉我实体不再在数据库中(这是错误的)
  3. 尝试em.merge()代替em.persist():结果与预期相同
  4. 调用em.contains(entity);返回true,因此实体已实际附加
  5. 使用em.persist();
  6. 在单独的方法中执行@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW),将{{1}}置于单独的事务中

    persist()必然存在某种问题;使用@EmbeddedId时,我只是不明白。

1 个答案:

答案 0 :(得分:0)

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