JPA问题的一个一对一的关联级联= PERSIST

我有这个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设计。

亲切的问候 马西莫

回答:

保持在内存中的对象之间的双向关系,双方之间的一致性是你的责任。在保存关系时,JPA提供程序查看关系的拥有方,即在没有mappedBy的那一方。

我认为第二种方法是最干净的,因为它自动保持一致性,所以你不能忘记去做。或者,您可以创建一个特殊函数来关联除setter之外的这些实体,并限制对setter的访问。

回答:

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

以上是 JPA问题的一个一对一的关联级联= PERSIST 的全部内容, 来源链接: utcz.com/qa/265147.html

回到顶部