1

OpenJpa2でエンティティーを保存するために使用する方法が正しいかどうか疑問に思っています。

デシリアライズしたRESTサービスからオブジェクトを受け取り、このインスタンスを保存します。

  1. トランザクションを開始します
  2. DBからインスタンスを取得します(このインスタンスはすでに取得していますが)
  3. デタッチされたインスタンスからDBから取得されたインスタンスに属性をコピーします
  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;
}

なにか提案を?

ありがとう

4

1 に答える 1

0

クリスのコメントによると、あなたはただ電話em.merge(event)をして、JPAにすべてを処理させることができるはずです。必要に応じて、新しいイベント行の作成、イベント属性の更新、および含まれているオブジェクトの更新または作成も自動的に処理する必要があります。

于 2013-01-17T14:26:48.263 に答える