Glassfish 컨테이너에서 JPA를 사용하고 있습니다. 다음 모델이 있습니다 (완료되지 않음)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이없는 테스트를 수행했습니다.
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 필드없이 작동 나는 무 EJB에서 다음과 같은 서비스가있다. @Version 필드를 사용하면 OptimisticLockException이 발생합니다.
그 방법이 잘못 되었습니까? 항상 em.find (...)를 수행하고 getter 및 setter를 통해 관리되는 엔터티를 수정해야합니까?
도움을 주시면 감사하겠습니다.
BR 르네
나는 그것을 이해하지 못한다. 나는 어떤 luns도 아직 추가하지 않았다. – reen
죄송합니다. 분명히 충분히 자세히 읽지 않았습니다. 나는 당신을 위해 나의 대답을 바꾸었다. – weltraumpirat
답변 해 주셔서 대단히 감사합니다. 따라서 해당 시나리오에서 버전 관리를 제거하라는 메시지가 나타납니다. 그런 다음 클라이언트 소프트웨어는 한 번에 하나의 노드 만 업데이트된다는 것을 보장해야합니다. – reen