2014-09-04 1 views
0

두 개의 외래 키가있는 Mail이라는 jpa 엔티티를 작성했습니다.속성을 유지하지 않고 엔티티를 수정할 수없는 이유는 무엇입니까?

public void modifyMail(Mail mail) { 
    Mail m = em.find(Mail.class, mail.getId()); 
    m.setUser(mail.getUser()); 
    m.setType(mail.getType()); 
    em.persist(m); 
} 

을했지만 작동하지 않습니다 내가 메일을 수정할 때

public class Mail implements Serializable { 


@ManyToOne(optional = false, fetch = FetchType.LAZY) 

@JoinColumn(name = "auteur") 
private User user; 

@JoinColumn(name = "typeC") 
@ManyToOne(optional = false, fetch = FetchType.LAZY) 
private Type typeMail; 
.... 

가와,이 좋아해요. glassfich 로그에서 "em.persist"는 올바르게 작동하지만 glassfich는 User 테이블에 삽입을 나타냅니다. 테이블 User에서 이름은 고유하므로 작동하지 않으며 glassfich가 메일 연관 사용자를 생성하려고하는 이유를 알지 못합니다. 누군가 왜 제발 저에게 말해 줄 수 있는지 알고 있다면?

답변

0

엔티티 관리자는 가져온 모든 개체/인스턴스를 추적합니다. 따라서 em.find()을 사용하여 사용자를로드하면이 사용자 인스턴스에 대해 알 수 있습니다.

사용자 인스턴스를로드하는 데 사용한 트랜잭션을 닫은 후에 사용자 인스턴스를 유지하면 해당 인스턴스가 부실 해집니다. 엔티티 관리자는 더 이상 사실을 모르고 새로운 것으로 가정합니다.

그래서 위의 코드는 할 필요가 :

public void modifyMail(Mail mail) { 
    Mail m = em.find(Mail.class, mail.getId()); 
    User u = em.find(User.class, mail.getUser().getId()); 
    m.setUser(u); 
    m.setType(mail.getType()); 
    em.persist(m); 
} 

또는

public void modifyMail(Mail mail) { 
    Mail m = em.find(Mail.class, mail.getId()); 
    User u = em.refresh(mail.getUser()); 
    m.setUser(u); 
    m.setType(mail.getType()); 
    em.persist(m); 
} 

그 이유는 엔티티 관리자는 무엇을 "사용자"또는 "메일"방법을 알고하지 않습니다. 모든 개체는 동일합니다. 따라서 사용자를 어딘가에서 변경하면 Mail에있는 사용자 인스턴스가 오래되었을 수 있습니다.

그러나 더 좋은 방법은 Mail 인스턴스가 실제로 변경 될 때 코드를 변경 아마도 : 변경 사항을 확인, 변경 수집 그래서 그 대신

em.getTransaction().begin(); 

    Mail mail = em.find(Mail.class, id); 
    User u = em.find(User.class, userId); 
    mail.setUser(u); 

    em.getTransaction().end(); 

을 거래를 시작 EM에서 관련된 모든 객체를로드 트랜잭션을 커밋하십시오.

+0

및 "em.persist"가 필요하지 않음을 추가 할 수 있습니다. 개체가 "관리되는"경우 필드에 대한 업데이트가 가로 채기 때문입니다. –

+0

@BillyFrost : 정말요? 나는 결코 이것을 시도하지 않았다; 나는 내가 객체 (그리고 내가 본 모든 예제는 결국'persist() '를 호출 할 것임)에 대한 변경을 "커밋"해야한다고 생각했다. 하지만 당신 말이 맞아요. http://www.objectdb.com/java/jpa/persistence/update –

+0

아론이주는 첫 번째 코드를 시도해 주셔서 감사합니다. – Ediruth

관련 문제