2013-01-17 148 views
1

我想知道如果我用OpenJpa 2保存實體的方式是正確的。OpenJpa合併分離對象

我收到我反序列化休息服務對象,然後保存該實例:

  1. 開始事務
  2. 從數據庫檢索實例(即使我已經有了這個實例)
  3. 複製從分離實例從DB
  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; 
} 

有什麼建議嗎?

感謝

+2

爲什麼不使用合併而不是從數據庫中查找實體?合併應該查找實體並將屬性複製到它中。 – Chris

回答

0

每克里斯的評論 - 你應該能夠只是調用em.merge(event)讓JPA處理這一切。如果需要,它應該自動處理創建一個新的Event行,更新Event屬性以及更新或創建包含的對象。