【发布时间】:2011-06-04 17:28:47
【问题描述】:
我在 Glassfish 容器中使用 JPA。我有以下Modell(不完整)
@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雷内
【问题讨论】:
标签: java jpa collections entity