【问题标题】:JDO tries to create a new record when associating using one to many relation使用一对多关系进行关联时,JDO 尝试创建新记录
【发布时间】:2014-06-07 11:19:31
【问题描述】:

我正在使用 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 表的用户 ID(主键)的外键。

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

每次用户登录时,我都会在数据库中创建一个 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();
        }
    }

请帮忙。 提前致谢。

【问题讨论】:

  • “用户”处于什么生命周期状态?分离?短暂的?空洞的?没有这样的信息,我看不出你怎么能理解它。日志说?
  • 我使用persistenceManager检索用户,然后关闭。然后我尝试使用另一个persistenceManager 创建一个UserSession 对象。我认为用户对象现在处于瞬态。日志说,请求失败是因为它试图再次插入用户对象,并且由于唯一约束而失败。

标签: mysql google-cloud-datastore jdo datanucleus


【解决方案1】:

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

如果您不想要新对象,则在调用 makePersistent 时传入托管(持久清洁、空心等)或分离对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2013-04-17
    • 2011-03-01
    • 2010-10-27
    相关资源
    最近更新 更多