我将 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;
这就是我的角色课所说的。我有这个是因为如果没有角色使用它,我希望删除该派系。我想这就是问题所在?我现在该怎么做?