我在Glassfish容器中使用JPA。我有以下Modell(未完成)用集合更新實體的JPA最佳實踐
@Entity
public class Node {
@Id
private String serial;
@Version
@Column(updatable=false)
protected Integer version;
private String name;
@ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
private Set<LUN> luns = new HashSet<LUN>();
@Entity
public class LUN {
@Id
private String wwid;
@Version
@Column(updatable=false)
protected Integer version;
private String vendor;
private String model;
private Long capacity;
@ManyToMany(mappedBy = "luns")
private Set<Node> nodes = new HashSet<Node>();
此信息每天都會更新。現在我的問題是,做到這一點的最佳做法是什麼。我的第一種方法是,我每天都在客戶端(帶有LUN)上生成節點對象,然後通過服務將它合併到數據庫(我想讓JPA完成這項工作)。
現在我做了一些沒有LUN的測試。我有一個無狀態的EJB以下服務:
public void updateNode(Node node) {
if (!nodeInDB(node)) {
LOGGER.log(Level.INFO, "persisting node {0} the first time", node.toString());
em.persist(node);
} else {
LOGGER.log(Level.INFO, "merging node {0}", node.toString());
node = em.merge(node);
}
}
測試:
@Test
public void addTest() throws Exception {
Node node = new Node();
node.setName("hostname");
node.setSerial("serial");
nodeManager.updateNode(node);
nodeManager.updateNode(node);
node.setName("newhostname");
nodeManager.updateNode(node);
}
此作品,未經@Version場。通過@Version字段,我得到一個OptimisticLockException。
這是錯誤的方法?我是否必須始終執行em.find(...),然後通過getter和setter修改受管實體?
任何幫助表示讚賞。
BR Rene
我不明白。我沒有添加任何內容。 – reen 2011-01-07 08:38:58