2014-06-07 33 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时,你传递一个托管的(持久干净,空心等)或分离的对象。

相关问题