假设我有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。我也尝试了以下事项:
em.flush();
:什么都不做em.refresh(entity);
:异常告诉我实体不再在数据库中(这是错误的)em.merge()
代替em.persist()
:结果与预期相同em.contains(entity);
返回true,因此实体已实际附加em.persist();
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
,将{{1}}置于单独的事务中
醇>
persist()必然存在某种问题;使用@EmbeddedId时,我只是不明白。
答案 0 :(得分:0)
您不能将GeneratedValue(strategy = GenerationType.IDENTITY)放在复杂的映射上。它需要进入embeddedId类,并且需要为新实体实例化MyComplexEntityId实例。您还需要刷新数据库,以确保在插入时为身份值分配值。