2012-03-04 93 views
0

我仍然不是實體狀態完全清楚,我已經失敗嘗試就下列情況幾件事情:JPA的新手 - 不堅持每個包含實體時現有成員堅持

@Entity 
public class Foo { 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id", nullable = false) 
    private long id; 
    /* other fields */ 
    @NotNull 
    @ManyToOne 
    @JoinColumn(name = "related_bar", nullable = false) 
    private Bar bar; 
    /* getters & setters */ 
} 

@Entity 
public class Bar { 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id", nullable = false) 
    private long id; 
    /* other fields & methods*/ 
} 

通常情況下,當數據從Foo創建表單發送,相關欄的ID將被髮送(但不包括其他屬性,它們在那裏沒有用處)。 是否有任何自動的方法來告訴實體管理器附加(而不是持久化)持久化新Foo時設置ID的Bar實例?

在此先感謝您的幫助!

羅爾夫

回答

1
Bar bar = em.getReference(Bar.class, barId); 
foo.setBar(bar); 

getReference()甚至沒有進入到數據庫:它返回一個代理,以實際的吧。如果它不存在,由於foreigk鍵引用錯誤,在刷新時會拋出一個錯誤。如果你想檢查該實體是否存在:

Bar bar = em.find(Bar.class, barId); 
if (bar == null) { 
    throw someException(); 
} 
foo.setBar(bar); 
+0

好的,所以我必須在每次調用之前手動調用此函數,然後再繼續執行Foo實例嗎? – Rolf 2012-03-04 09:56:27

+0

是的,就是這樣。 – 2012-03-04 09:58:35