我在使用derby的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类。

我猜汤姆·安德森的答案已经是正确的答案。我正在创建NEW 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.


这是在我执行此操作时发生的:创建character1,创建完全相同的派系character2(仅在数据库中一次),尝试删除character2。知道为什么吗?

EDIT2:忘记了重要的事情:

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


这就是我的角色课所说的。我之所以这样,是因为如果没有角色在使用派系,我希望将其删除。我想那是问题吗?我现在该怎么办?

最佳答案

这应该工作。如果两个MyClass实例指向同一个AnotherClass实例,则AnotherClass表中将存在一个条目,两个MyClass条目均引用该条目。

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

10-08 18:02