2013-07-24 29 views
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。我也嘗試了以下幾件事:

  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,但我只是不明白。

+1

您無法將GeneratedValue(strategy = GenerationType.IDENTITY)放在複雜的映射上。它需要在embeddedId類中進行,並且需要爲新實體實例化一個MyComplexEntityId實例。您還需要刷新到數據庫以確保值被分配,因爲標識值由插入分配。 – Chris

+0

先生,你是我新的個人英雄。這是完全正確的,它現在起作用了! – shinlang

+0

我不應該以某種方式將這個問題標記爲答案,並將答案給予答覆者?這是我第一次與SO一起閱讀的經歷,對不起^^ – shinlang

回答

0

您無法將GeneratedValue(strategy = GenerationType.IDENTITY)放在複雜的映射上。它需要在embeddedId類中進行,並且需要爲新實體實例化一個MyComplexEntityId實例。您還需要刷新到數據庫以確保值被分配,因爲標識值由插入分配。