Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenJpa合并分离对象_Java_Jpa_Openjpa - Fatal编程技术网

Java OpenJpa合并分离对象

Java OpenJpa合并分离对象,java,jpa,openjpa,Java,Jpa,Openjpa,我想知道我用OpenJPA2保存实体的方法是否正确 我从我反序列化的rest服务接收对象,然后保存此实例: 开始交易 从数据库中检索实例(即使我已经得到了这个实例) 将分离实例的属性复制到从数据库检索的实例 调用合并 提交事务 如果是一个复杂的实体模型,它会变得很痛苦 public boolean save(收集事件)引发DataException{ 如果(事件==null){ 抛出新的DataException(“无法保存空事件”); } EntityManager em=getEntityM

我想知道我用OpenJPA2保存实体的方法是否正确

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

  • 开始交易
  • 从数据库中检索实例(即使我已经得到了这个实例)
  • 将分离实例的属性复制到从数据库检索的实例
  • 调用合并
  • 提交事务
  • 如果是一个复杂的实体模型,它会变得很痛苦

    public boolean save(收集事件)引发DataException{
    如果(事件==null){
    抛出新的DataException(“无法保存空事件”);
    }
    EntityManager em=getEntityManager();
    试一试{
    em.getTransaction().begin();
    对于(事件:事件){
    布尔加法=真;
    if(event.getKey()>0){
    Event-previousEvent=em.find(Event.class,Event.getKey());
    if(previousEvent!=null){
    //更新
    setTitle(event.getTitle());
    previousEvent.setDate(event.getDate());
    previousEvent.setDescription(event.getDescription());
    列表参与者=新建ArrayList();
    for(成员m:event.getParticipants()){
    Member participant=em.find(Member.class,m.getKey());
    如果(参与者!=null){
    参与者。添加(参与者);
    }
    }
    previousEvent.setParticipants(参与者);
    列表注册者=新ArrayList();
    对于(成员m:event.getRegistrants()){
    成员注册者=em.find(Member.class,m.getKey());
    如果(注册人!=null){
    参与者。添加(注册人);
    }
    }
    先前事件。设置注册人(注册人);
    em.merge(先前事件);
    add=false;
    } 
    } 
    如果(添加){
    //加
    em.persist(事件);
    }
    }
    em.getTransaction().commit();
    }捕获(PersistenceException pe){
    pe.printStackTrace();
    抛出新的DataException(“保存事件时发生错误”,pe);
    }最后{
    em.close();
    }
    返回true;
    }
    
    有什么建议吗


    根据Chris的评论,谢谢

    ——你应该可以调用
    em.merge(event)
    ,让JPA处理所有的事情。如果需要,它应该自动处理创建新的事件行、更新事件属性以及更新或创建包含的对象。

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