当使用一对多关系关联时,JDO尝试创建新记录

时间:2014-06-07 11:19:32

标签: mysql google-cloud-datastore jdo datanucleus

我正在使用 datanucleus / MySQL5.6 / Google App Engine1.9.4 / JDO3.0 / Spring3.0。

情况是,我有一个用户类

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

}

UserUserSession之间有一对多关系。在UserSession表中,我已经定义了一个引用User表的userid(主键)的外键。

我在用户第一次注册时创建了用户记录。

每次用户登录时,我都会在数据库中创建一个UserSession记录。我能够在DB中成功创建用户记录。 当用户登录时,我正在创建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();
        }
    }

请帮助。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果对象处于瞬态状态,那么它将创建一个NEW对象,就像JDO规范所说的那样。日志会告诉你它处于什么状态,所以不需要猜测。

如果您不想要一个新对象,则在调用makePersistent时会传递一个托管(持久清理,空心等)或分离对象。