2014-06-07 146 views
0

我正在使用datanucleus/MySQL5.6/Google App Engine1.9.4/JDO3.0/Spring3.0。當使用一對多關係關聯時,JDO嘗試創建新記錄

的情況是,我有一個User類

@PersistenceCapable(table="Users") 
public class User { 
    @PrimaryKey 
    @Persistent(column="UserID", valueStrategy=IdGeneratorStrategy.NATIVE) 
    private Long ID; 
    //some more fields below 
} 

我有一個UserSession類

@PersistenceCapable(table="usersessions") 
public class UserSession extends DomainObject { 

    private static final long serialVersionUID = 1L; 

    @PrimaryKey 
    @Persistent(column="SessionID", valueStrategy=IdGeneratorStrategy.NATIVE) 
    private Long ID; 

    @Persistent 
    @Column(name="UserID") 
    private User user; 

} 

我有一對多的關係UserSessionUser之間。在UserSession表中,我定義了一個引用User表的userid(主鍵)的外鍵。

我在用戶第一次註冊時創建了用戶記錄。

每次用戶登錄我在數據庫中創建一個UserSession記錄。我能夠在數據庫中成功創建用戶記錄。 當用戶登錄時,我創建一個UserSession對象,將以前檢索到的User對象關聯到UserSession對象。

當我堅持UserSession時,它試圖在數據庫中創建一個新的用戶記錄。

我只想將現有的用戶記錄與新創建的UserSession對象相關聯。

我不想擁有雙向的一對多關聯。

下面是創建UserSession對象的代碼,

@Override 
    @Transactional(propagation = Propagation.REQUIRED) 
    public UserSession createSession(User user, String sessionId) { 
     PersistenceManager pm = persistenceManagerFactory.getPersistenceManager(); 
     try { 
      UserSession userSession = new UserSession(); 
      userSession.setAppSession(sessionId); 
      userSession.setUser(user); 
      pm.makePersistent(user); 
      return userSession; 
     } finally { 
      pm.close(); 
     } 
    } 

請幫助。 在此先感謝。

+0

和「用戶」處於什麼生命週期狀態?超脫?短暫的?鏤空?沒有這些信息,我看不出你怎麼理解它。日誌說? –

+0

我使用一個persistenceManager檢索用戶,然後關閉它。然後我試圖使用另一個persistenceManager創建一個UserSession對象。我認爲用戶對象現在處於瞬態狀態。日誌說,請求失敗,因爲它試圖再次插入用戶對象,並且由於唯一的約束而失敗。 – Thirupathi

回答

0

如果對象處於瞬態狀態,那麼它將創建一個NEW對象,就像JDO規範所說的那樣。日誌會告訴你它處於什麼狀態,所以不需要猜測。

如果你不想要一個新的對象,當你調用makePersistent時,你傳遞一個託管的(持久乾淨,空心等)或分離的對象。

相關問題