JDO多对一关系在第二个表中插入新记录

时间:2014-09-20 14:36:43

标签: java mysql jdo datanucleus

我在JDO中有多对一的关系,其中表BAR预先填充了值:

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class BAR {
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    @Unique
    private String name;   
}

我现在想要在数据库中插入许多新的对象FOO,它们具有BAR.id的字段和约束 - 所以我不想在BAR表中添加新记录,我只想插入FOO与FOO中现有记录的关系。

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class FOO {
    @PrimaryKey @Expose
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent @Expose
    BAR bar;
}

当我创建我的对象并试图坚持它时,我得到:

javax.jdo.JDODataStoreException: Insert of object "com.ba.orm.BAR@3bc8657a" using statement "INSERT INTO `BAR` (`NAME`) VALUES (?)" failed : Duplicate entry  

明显发生了什么,它试图将孩子插入父母并在数据库级别失败 - 我无法弄清楚如何告诉JDO这是一个现有的记录。我只是使用DataNucleus和JDO 3 - 而不是GAE。

此持久性代码有效,但我想知道是否可以使我的FOO对象保持不变并创建与BAR表的关联,而无需获取BAR对象的附加副本并使用setter重置它。

执行getObjectById和设置对象的过程对我来说感觉不对,我觉得我错过了什么。随着应用程序的增长,这将变得越来越麻烦。

 Transaction tx = pm.currentTransaction();

 tx.begin();

 BAR bar = pm.getObjectById(BAR.class, foo.getBar().getId());

 foo.setBar(bar);

 pm.makePersistent(foo);

 tx.commit();

0 个答案:

没有答案
相关问题