Я использую JPA в контейнере Glassfish.У меня есть следующая модель (не полная)
@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>();
Эта информация будет обновляться ежедневно.Теперь мой вопрос заключается в том, каков наилучший способ сделать это.
Мой первый подход заключался в том, чтобы каждый день я генерировал объекты 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 (...), а затем изменять управляемый объект с помощью методов получения и установки?
Любая помощь приветствуется.
BR Rene