【问题标题】:OpenJpa merge detached objectOpenJpa 合并分离对象
【发布时间】:2013-01-17 12:42:12
【问题描述】:

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

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

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

如果是带有compsitions的复杂实体模型,那就很痛苦了!

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

有什么建议吗?

谢谢

【问题讨论】:

  • 为什么不直接使用合并而不是从数据库中查找实体?合并应该为您查找实体并将属性复制到其中。

标签: java jpa openjpa


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多