1

我将 Datanucleus (jdo) 与 derby 一起使用,并且我有一个 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)。所以我猜 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.

当我这样做时就发生了这种情况:创建角色1,创建角色2完全相同的派系(它只在数据库中一次),尝试删除角色2。知道为什么吗?

EDIT2:忘记了一些重要的事情:

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

这就是我的角色课所说的。我有这个是因为如果没有角色使用它,我希望删除该派系。我想这就是问题所在?我现在该怎么做?

4

1 回答 1

0

这应该只是工作。如果两个 MyClass 实例指向同一个AnotherClass 实例,那么在 AnotherClass 表中将有一个条目,由两个 MyClass 条目引用。

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

于 2010-12-14T11:04:13.400 回答