0
後比方說,我有2周JPA的entitesJPA EmbeddedId堅持
@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 entity = new MyComplexEntity("something");
em.persist(entity);
System.out.println(entity);
新MyComplexEntity對象爲空
和我得到的是這樣的:
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)
必須有persist()的某種問題;當使用@EmbeddedId,但我只是不明白。
您無法將GeneratedValue(strategy = GenerationType.IDENTITY)放在複雜的映射上。它需要在embeddedId類中進行,並且需要爲新實體實例化一個MyComplexEntityId實例。您還需要刷新到數據庫以確保值被分配,因爲標識值由插入分配。 – Chris
先生,你是我新的個人英雄。這是完全正確的,它現在起作用了! – shinlang
我不應該以某種方式將這個問題標記爲答案,並將答案給予答覆者?這是我第一次與SO一起閱讀的經歷,對不起^^ – shinlang