2012-11-29 18 views
1

我有一個父實體客戶端。該客戶可以訪問該網站並創建約會。這意味着約會是在另一個時間創建的,然後是客戶端對象。繼續在GAE上添加子實體到父代

我的問題是:如何將子對象添加到已經保存的父對象? 如果調用以下示例中的函數addData1(),則會創建約會表並添加條目。當函數addData2()被調用時,這不會發生。

是不是因爲當關閉實體管理器後更新持久對象時,這也會在表中更新?

@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); 
} 

回答

1
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(); <--- You persist client with no appointment 
    for(Appointment a : newAppointments) 
     client.addAppointment(a); <-- those entitys are detached entity (not persisted) 
} 

此功能不會因爲你試圖持久化對象與分離實體

你應該得到這樣的例外:

Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.test.Appointment 

,如果你想避免這種例外,你可以試試這種方法:

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(); 
} 

順便說一句,嘗試使用名稱作爲ID作爲ID

+0

感謝您的回覆。您的示例確實有效,但可能沒有持久客戶端對象的實體管理器。在這種情況下,您如何爲客戶添加約會? – Noob

+0

就你而言,你可以先嚐試堅持預約實體,然後檢索約會,然後添加到你的客戶端對象。 –

相關問題