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