我正在使用带有德比的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;
这就是我的角色课所说的。我有这个,因为如果没有角色使用它我想要删除阵营。我想这就是问题所在?我现在该怎么办?
答案 0 :(得分:0)
这应该可行。如果两个MyClass实例指向相同的 AnotherClass实例,则AnotherClass表中将有一个条目,由两个MyClass条目引用。
如果你看到很多AnotherClass条目,那只能是因为你在运行时有很多不同的实例。你如何定义AnotherClass的身份?你如何将MyClass实例与AnotherClass实例相关联?