GAE JPA2 OneToMany关系没有超脱

时间:2013-11-07 15:12:37

标签: java google-app-engine jpa jpa-2.0

我的GAE JPA2应用程序中的OneToMany关系存在问题。

我有两个班级:

@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。

有什么想法吗?

更新 我也可以通过在testbed服务中使用以下行来重现问题

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

1 个答案:

答案 0 :(得分:1)

  1. 在暂停b之前,您忘了将其添加到a的列表中。
  2. 另一个问题可能是你使用了两个没有共同点的EntityManager。保存AB
  3. 时,请尝试使用相同的em