我在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();