Java 在GAE上持久化后将子实体添加到父实体

Java 在GAE上持久化后将子实体添加到父实体,java,google-app-engine,jpa,Java,Google App Engine,Jpa,我有一个父实体客户。该客户可以访问该网站并创建约会。这意味着约会是在客户机对象之后的另一个时间创建的 我的问题是:如何将子对象添加到已持久化的父对象? 如果调用下面示例中的函数addData1(),将创建一个约会表并添加一个条目。调用函数addData2()时,不会发生这种情况 当您在关闭entitymanager后更新持久化对象时,表中的持久化对象是否也会更新 @Entity public class Client{ @Id private String name; @

我有一个父实体客户。该客户可以访问该网站并创建约会。这意味着约会是在客户机对象之后的另一个时间创建的

我的问题是:如何将子对象添加到已持久化的父对象? 如果调用下面示例中的函数addData1(),将创建一个约会表并添加一个条目。调用函数addData2()时,不会发生这种情况

当您在关闭entitymanager后更新持久化对象时,表中的持久化对象是否也会更新

@Entity
public class Client{
    @Id
    private String name;
    @OneToMany(cascade = CascadeType.ALL)
    private Set<Appointment> appointments;
}

@Entity
public class Appointment{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;
}

// This works
public function addData1(){
    EntityManager em = EMF.get().createEntityManager();
    Client client = new Client(name);
    for(Appointment a  : newAppointments)
        client.addAppointment(a);
    em.persist(client);
    em.close();
}

// This doesn't work.
public function addData2(){
    EntityManager em = EMF.get().createEntityManager();
    Client client = new Client(name);
    em.persist(client);
    em.close();
    for(Appointment a  : newAppointments)
        client.addAppointment(a);
}
@实体
公共类客户端{
@身份证
私有字符串名称;
@OneToMany(级联=级联类型.ALL)
私人预约;
}
@实体
公开课任命{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私钥id;
}
//这很有效
公共函数addData1(){
EntityManager em=EMF.get().createEntityManager();
客户=新客户(名称);
预约(a:新预约)
委托人:预约(a);
em.persist(客户);
em.close();
}
//这不管用。
公共函数addData2(){
EntityManager em=EMF.get().createEntityManager();
客户=新客户(名称);
em.persist(客户);
em.close();
预约(a:新预约)
委托人:预约(a);
}
此函数之所以有效,是因为可以持久化所有对象

// This doesn't work.
public function addData2(){
    EntityManager em = EMF.get().createEntityManager();
    Client client = new Client(name);
    em.persist(client);
    em.close();    <--- You persist client with no appointment
    for(Appointment a  : newAppointments)
        client.addAppointment(a);   <-- those entitys are detached entity ( not persisted)
}
如果要避免此异常,可以尝试以下方法:

public void addData2(List<Appointment> newAppointments){
    Client client = new Client();
    client.setName("name1");
    entityManager.persist(client);
    for(Appointment a  : newAppointments)
        client.addAppointment(a);
    entityManager.merge(client);
    entityManager.close();
}
public void addData2(列出新约会){
客户端=新客户端();
客户。设置名称(“名称1”);
entityManager.persist(客户端);
预约(a:新预约)
委托人:预约(a);
entityManager.merge(客户端);
entityManager.close();
}
顺便说一句,尝试使用名称作为Id无效

此函数之所以有效,是因为可以持久化所有对象

// This doesn't work.
public function addData2(){
    EntityManager em = EMF.get().createEntityManager();
    Client client = new Client(name);
    em.persist(client);
    em.close();    <--- You persist client with no appointment
    for(Appointment a  : newAppointments)
        client.addAppointment(a);   <-- those entitys are detached entity ( not persisted)
}
如果要避免此异常,可以尝试以下方法:

public void addData2(List<Appointment> newAppointments){
    Client client = new Client();
    client.setName("name1");
    entityManager.persist(client);
    for(Appointment a  : newAppointments)
        client.addAppointment(a);
    entityManager.merge(client);
    entityManager.close();
}
public void addData2(列出新约会){
客户端=新客户端();
客户。设置名称(“名称1”);
entityManager.persist(客户端);
预约(a:新预约)
委托人:预约(a);
entityManager.merge(客户端);
entityManager.close();
}

顺便说一句,尝试使用名称作为Id无效

谢谢您的回复。您的示例确实有效,但是我可能没有持久化客户端对象的entitymanager。在这种情况下,如何将约会添加到客户端?在您的情况下,您可以先尝试保留约会实体,然后检索约会,然后添加到客户端对象。感谢您的回复。您的示例确实有效,但是我可能没有持久化客户端对象的entitymanager。在这种情况下,如何将约会添加到客户端?在您的情况下,可以先尝试保留约会实体,然后检索约会,然后添加到客户端对象。