2011-03-16 3 views
1

JPA 문제 one-to-one 연관 cascade = PERSIST

이 ER 모델이

 Message 0..1 <--> 0..1 MessageDetail 
    PK:ID_MESSAGE   PK: ID_DETAIL 
     NAME     DETAIL 
          FK: ID_MESSAGE 

그리고 상대 개체 매핑은 다음과 같습니다.

class OnlineEventMessage { 
    @Id 
    @Column(name = "ID_EVENT_MESSAGE") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ") 
    private Long idEventMessage; 

    @OneToOne(mappedBy="onlineEventMessage", cascade=CascadeType.PERSIST) 
    private EventMessageAnagrafica eventMessageAnagrafica; 
} 

public class EventMessageAnagrafica { 

    @Id 
    @Column(name = "ID_EVENT_MESSAGE_ANAG") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ") 
    private Long idEventMessageAnagrafica; 

    @OneToOne(cascade=CascadeType.PERSIST) 
    @JoinColumn(name = "FK_ID_EVENT_MESSAGE") 
    private OnlineEventMessage<?> onlineEventMessage; 
} 

이 테스트에서는 개체를 처리하는 방법을 보여줍니다.

@Test 
    public void testSaveItem() { 
     EntityManager entityManager = factoryCont0.createEntityManager(); 

     entityManager.getTransaction().begin(); 

     OnlineEventMessage<String> eventMessage = new OnlineEventMessage<String>(EventType.ONLINE_REIMPIANTO_CONTRATTO); 

     EventMessageAnagrafica eventMessageAnagrafica = new EventMessageAnagrafica(multichannelId); 
     eventMessage.setEventMessageAnagrafica(eventMessageAnagrafica); 

     entityManager.persist(eventMessage); 
     entityManager.getTransaction().commit(); 
     entityManager.close(); 
    } 

eventMessageAnagrafica의 eventMessage는 FK를 저장하지 않습니다.

1)이 코드 줄을 추가하십시오 : eventMessageAnagrafica.setOnlineEventMessage(eventMessage); 그리고 자식 개체를 저장하십시오 : entityManager.persist(eventMessageAnagrafica);entityManager.persist(eventMessageAnagrafica);

2) 부모 설정자를 아래와 같이 변경하십시오 :

public void setEventMessageAnagrafica(EventMessageAnagrafica eventMessageAnagrafica) { 
     this.eventMessageAnagrafica = eventMessageAnagrafica; 
     if (eventMessageAnagrafica != null) { 
      eventMessageAnagrafica.setOnlineEventMessage(this); 
     } 
    } 

이것을 수행하는 다른 방법이 있습니까? 추신 처음에는 FK가 부모 테이블 Message에 있었지만 DBA는 이것이 좋은 응급실 디자인이 아니라고 말했습니다.

종류 관련 안부 Massimo

답변

2

당신의 책임을 메모리에 객체 사이의 양방향 관계의 측면 사이의 일관성을한다 유지 간주한다. 관계를 저장하면 JPA 공급자는 관계의 소유 측면, 즉 mappedBy이없는 측면을 봅니다.

필자는 두 번째 방법이 자동으로 일관성을 유지하므로 사용자가 잊지 않도록 두 번째 방법이 가장 깨끗하다고 ​​생각합니다. 또는 setter가 아닌 이들 엔티티를 연관시키는 특수 함수를 작성하고 setter에 대한 액세스를 제한 할 수 있습니다.

0
entityManager.getTransaction().begin(); 

OnlineEventMessage<String> eventMessage = new OnlineEventMessage<String>(EventType.ONLINE_REIMPIANTO_CONTRATTO); 

EventMessageAnagrafica eventMessageAnagrafica = new EventMessageAnagrafica(multichannelId); 
eventMessage.setEventMessageAnagrafica(eventMessageAnagrafica); 

//add this line 
eventMessageAnagrafica.setEventMessage(eventMessage); 

entityManager.persist(eventMessage);