2011-03-16 99 views
1

我有这个ER模型JPA问题的一个一对一的关联级联= PERSIST

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的事件消息不保存FK。 两种方法来节省垫层关联有:

1)添加这行代码:eventMessageAnagrafica.setOnlineEventMessage(eventMessage); 并保存该子对象:entityManager.persist(eventMessageAnagrafica);

2)改变为下面的父设定器:

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

有没有其他干净的方法来完成这个? P.S.最初FK在父表的Message上,但DBA告诉我这不是一个好的ER设计。

亲切的问候 马西莫

回答

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);