2012-07-31 81 views
1

我有下面的代碼:使用它首先創建,堅持ServiceRequest,然後創建一個事件,並添加到它現有的ServiceRequest的DataNucleus將谷歌App Engine的一個一對多的關係

@Entity 
public class Incident { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
    private String incidentId; 

    @Persistent 
    @Extension(vendorName="datanucleus", key="gae.pk-id", value="true") 
    private Long keyId; 


    @OneToMany(mappedBy="incident") 
    @OrderBy("requestId") 
    @JoinColumn(name="INCIDENT_ID") 
    public List<ServiceRequest> requests; 

    ... 
} 

@Entity 
public class ServiceRequest { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
    private String requestId; 

    @Persistent 
    @Extension(vendorName="datanucleus", key="gae.pk-id", value="true") 
    private Long keyId; 
    private Incident incident; 

    ... 
} 

方案 - 但當我試圖堅持一個事件我有以下的錯誤造成 :org.datanucleus.exceptions.NucleusUserException:ID爲「agxzbWFydGNpdHlhZ2hyFAsSDlNlcnZpY2VSZXF1ZXN0GAEM」對象是由不同的對象管理器管理

+0

而「現有的服務請求」是由不同的EntityManager,您可以輕鬆地通過使用在EM方法,看看它是管理檢查管理。如果分離,它不被任何東西管理 – DataNucleus 2012-07-31 14:00:30

+0

因此,不可能將現有的(已經存在的)對象添加到新的對象中?或者,也許我可以以某種方式將其附加到我的事件? – Eyck 2012-07-31 14:06:04

+0

當然有可能......當它由同一個EntityManager管理時(就像JPA規範所說的那樣)。你沒有給出任何信息,你從 – DataNucleus 2012-07-31 14:14:42

回答

1

我會sugest你開始爲然後告訴你深入研究關於所有數據存儲JDO Stu的文檔FF。然後感謝谷歌。 :-)

您必須使用相同的持久性管理器一次執行所有讀取/創建/保存/更新任務。這意味着在相同的方法或代碼塊,你必須:

  • 獲取新的PersistenceManager
  • 獲取EntityA你需要
  • 做任何你想做的事情,包括從其他類實例化其他實體和讓他們都以某種方式連接
  • 使用時要堅持一切
  • 關閉時

的事情是,如果你使用多個實體,你需要使用相同的PersistenceManager實例。

JDO doc - Google

+0

得到這個現有的對象好 - 它工作:)。但是,而不是PersistentManager我使用EntityManager - 使用這兩個有什麼區別?現在我又遇到了另一個問題 - 當我試圖從數據庫中提取我的「事件」時,它們的請求字段爲空。我geting他們使用的代碼'EntityManager em = EMF.get()。createEntityManager(); 查詢q = em.createQuery(「從事件I選擇我從事件IID」); 列表 list = q.getResultList();'我也嘗試將請求字段從public改爲private,並創建適當的setter和getter - 但仍然不起作用 – Eyck 2012-08-01 09:25:53

+0

它正在工作。當您擁有您的列表時,請求字段爲空,直到您訪問它(在關閉EntityManager之前)才能訪問它,並且它將隨時加載。它被稱爲延遲加載,這是一種可以騰出資源的技術。閱讀我對[這個問題]的答案(http://stackoverflow.com/questions/6643902/how-to-auto-fetch-jdo-nested-collection-of-entities/11204780#11204780) – 2012-08-02 10:00:26