0

オブジェクトをマージの結果に設定してから返す必要があるのか​​ 、それとも単にマージする必要があるのか​​ わかりません。以下の最初のブロックの手法を使用していますが、時々データが失われ、その理由がわかりません。

@Override
public T save(T object) {
    EntityManager em = null;
    EntityTransaction tx = null;
    try {
        em = getEntityManager();
        tx = em.getTransaction();
        tx.begin();

        object = em.merge(object);
        tx.commit();
        return object;
    } catch (RuntimeException e) {
        log.severe(e.getMessage());
        if (tx != null && tx.isActive()) {
            tx.rollback();
        }
        throw e;
    } finally {
        if (em != null && em.isOpen()) {
            em.close();
        }
    }
}

または、この方法でマージを行う必要がありますか?

@Override
public void save(T object) {
    EntityManager em = null;
    EntityTransaction tx = null;
    try {
        em = getEntityManager();
        tx = em.getTransaction();
        tx.begin();

        object = em.merge(object);
        tx.commit();

    } catch (RuntimeException e) {
        log.severe(e.getMessage());
        if (tx != null && tx.isActive()) {
            tx.rollback();
        }
        throw e;
    } finally {
        if (em != null && em.isOpen()) {
            em.close();
        }
    }
}

top メソッドが使用された後、渡されたオブジェクトが変更され、別の保存が行われる場合があります。このオブジェクトには、他のエンティティとの 1 対 1 および 1 対多の関係があります。1 対多のエンティティのいずれかのデータが失われたり、保存されなかったりすることがあります。しかし、問題を確実に再現することはできません。

4

1 に答える 1

0

本当にマージする必要がありますか? マージは通常、オブジェクトをシリアル化するときに使用されます。オブジェクトをシリアル化する必要がない場合は、マージする必要がない場合があります。同じ EntityManager からオブジェクトをクエリする場合は、オブジェクトを変更してからコミットするだけです。

于 2013-05-30T13:41:15.137 に答える