引用ID而不是在jdo中使用外键?

时间:2010-12-13 22:23:47

标签: java jdo derby datanucleus

我正在使用带有德比的Datanucleus(jdo),我有一个MyClass类。这个类有一个AnotherClass类型的变量。我想坚持这个变量。当持久化MyClass的实例时,变量AnotherClass也会被持久化。

现在问题:当我持久化一个新的MyClass并且这个实例具有与变量相同的AnotherClass实例时,我不想再将它保存到AnotherClass表中,而只是通过MyClass表中的ID引用它。否则,我的AnotherClass表将持有大量相同的实例。

在我的课上看起来像这样:

  @PersistenceCapable(identityType = IdentityType.APPLICATION)
  public class MyClass implements Serializable {

  private static final long serialVersionUID = -5074030667922748006L;

  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  Long key;

  @Persistent
  AnotherClass anotherClass;

更新

AnotherClass类看起来像MyClass类。

我猜汤姆安德森的答案已经是正确答案了。我正在创建新的AnotherClass实例并将它们放入MyClass实例中,如myClass.setAnotherClass(anotherClass)。所以我猜另一个类是一个具有相同值的实例,但它仍然不是同一个实例,所以它在数据库中得到自己的行,即使它看起来完全相同(ID除外)。

所以我猜解决方案是:检查AnotherClass实例是否已经存在于数据库中,如果是:从数据库中获取并将该实例设置为myClass。如果不是:创建一个新实例并将其设置为myClass,以便在myClass持久化时保持该实例。这是我应该这样做的吗?

编辑:好的,现在我遇到了一个新问题:我不能再删除MyClass(= Character)实例了。如果我尝试这样做,我会得到这个例外(AnotherClass = Faction):

java.sql.SQLIntegrityConstraintViolationException: DELETE on table 'FACTION' caused a violation of foreign key constraint 'CHARACTER_FK1' for key (1).  The statement has been rolled back.

当我这样做时才发生:创建character1,创建character2完全相同的派系(它只在数据库中一次),尝试删除character2。知道为什么吗?

EDIT2:忘了重要的事情:

  @Persistent(dependent = "true")
  Faction faction;

这就是我的角色课所说的。我有这个,因为如果没有角色使用它我想要删除阵营。我想这就是问题所在?我现在该怎么办?

1 个答案:

答案 0 :(得分:0)

这应该可行。如果两个MyClass实例指向相同的 AnotherClass实例,则AnotherClass表中将有一个条目,由两个MyClass条目引用。

如果你看到很多AnotherClass条目,那只能是因为你在运行时有很多不同的实例。你如何定义AnotherClass的身份?你如何将MyClass实例与AnotherClass实例相关联?