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