1

GAE JPA2 アプリケーションの OneToMany 関係に問題があります。

私は2つのクラスを持っています:

@Entity(name="A")
public class A {
    @Id
    private String uuid;
    @OneToMany(mappedBy="a")
    private List<B> bList;

    public A() {
        //set uuid
        bList = new ArrayList<B>();
    }

    public List<B> getBList() {
        return bList;
    }

    //Other getters and setters

    public static A create() {
        EntityManager em = //get entity manager
        A a = new A();
        try {
            em.persist(a);
        } catch(Exception e) {
            return null;
        } finally {
            em.close();
        }

        return a;
    }

    public static A getA(String uuid) {

        EntityManager em = // get EM
        A a = em.find(A.class, uuid);
        em.close();
        return a;
    }

    public void update() {
        EntityManager em = // create EM
        try {
            em.merge(this);
        } finally {
            em.close();
        }
    }
}

@Entity (name="B")
public class B
{
    //id stuff

    @ManyToOne(fetch=FetchType.EAGER)
    A a;

    public B(A a) {
        //create key using 'a' as parent
        this.a = a;
    }

    public static B create(A a) {
        EntityManager em = //create EM
        B b = new B(a);
        try {
          em.persist(b);
        } catch (Exception e) {
          return null;
        } finally {
          em.close();
        }
        return b;
    }

    //get and update methods similar to the A class above

}

そして、次のことを行っている小さなテストベッド サービスがあります。

String uuid; //hardcoded to match an existing uuid in the datastore
A a = A.getA(uuid);
B b = B.create(a);
a.getBList().add(b);
a.update();

なぜリストが分離されないのか混乱しています... FetchType が LAZY であれば理解できましたが、そうではありません... EAGER に設定されています。

何か案は?

UPDATE テストベッドサービスで次の行のみを使用するだけで、問題を再現できます

String uuid; //hardcoded to match an existing uuid in the datastore
A a = A.getA(uuid)
a.getBList();
4

1 に答える 1