gpt4 book ai didi

java - OpenJpa 合并分离对象

转载 作者:行者123 更新时间:2023-12-01 04:54:42 27 4
gpt4 key购买 nike

我想知道我使用 OpenJpa 2 保存实体的方式是否正确。

我从反序列化的休息服务接收对象,然后保存此实例:

  1. 开始交易
  2. 从数据库检索实例(即使我已经获得了该实例)
  3. 将属性从分离的实例复制到从数据库检索的实例
  4. 调用合并
  5. 提交交易

如果是具有组合的复杂实体模型,就会变得痛苦!

public boolean save(Collection<Event> events) throws DataException {

if (events == null) {
throw new DataException("Cannot save null events");
}

EntityManager em = getEntityManager();
try {
em.getTransaction().begin();
for (Event event : events) {

boolean add = true;

if(event.getKey() > 0){
Event previousEvent = em.find(Event.class, event.getKey());
if (previousEvent != null) {
//update
previousEvent.setTitle(event.getTitle());
previousEvent.setDate(event.getDate());
previousEvent.setDescription(event.getDescription());

List<Member> participants = new ArrayList<>();
for(Member m : event.getParticipants()){
Member participant = em.find(Member.class, m.getKey());
if(participant != null){
participants.add(participant);
}
}
previousEvent.setParticipants(participants);

List<Member> registrants = new ArrayList<>();
for(Member m : event.getRegistrants()){
Member registrant = em.find(Member.class, m.getKey());
if(registrant != null){
participants.add(registrant);
}
}
previousEvent.setRegistrants(registrants);

em.merge(previousEvent);
add = false;
}
}
if(add) {
//add
em.persist(event);
}
}
em.getTransaction().commit();

} catch (PersistenceException pe) {
pe.printStackTrace();
throw new DataException("An error occured while saving the event", pe);
} finally {
em.close();
}
return true;
}

有什么建议吗?

谢谢

最佳答案

根据 Chris 的评论 - 您应该能够只调用 em.merge(event) 并让 JPA 处理所有这些。如果需要,它应该自动处理创建新的事件行、更新事件属性以及更新或创建所包含的对象。

关于java - OpenJpa 合并分离对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14379391/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com