Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jdo中引用ID而不是使用外键?_Java_Jdo_Derby_Datanucleus - Fatal编程技术网

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

Java 在jdo中引用ID而不是使用外键?,java,jdo,derby,datanucleus,Java,Jdo,Derby,Datanucleus,我将Datanucleus(jdo)与derby一起使用,我有一个类MyClass。这个类有另一个类类型的变量。我想保留这个变量。当MyClass的实例被持久化时,变量AnotherClass也被持久化 现在的问题是:当我持久化一个新的MyClass时,这个实例与变量具有相同的AnotherClass实例,我不想再次将它保存到AnotherClass表中,而只是通过MyClass表中的ID引用它。否则,我的另一个类表将保留大量相同的实例 此时此刻,我的班级是这样的: @Persistence

我将Datanucleus(jdo)与derby一起使用,我有一个类MyClass。这个类有另一个类类型的变量。我想保留这个变量。当MyClass的实例被持久化时,变量AnotherClass也被持久化

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

此时此刻,我的班级是这样的:

  @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;
更新: 另一个类看起来像MyClass类

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

因此,我猜解决方案是:检查另一个类实例是否已在数据库中持久化,如果是:从数据库中获取它并将该实例设置为myClass。如果不是:创建一个新实例,并将其设置为myClass,以便在myClass被持久化时将其持久化。我应该这样做吗

编辑:好的,现在我有一个新问题:我不能再删除MyClass(=字符)实例了。如果我尝试这样做,我会得到这个异常(另一个类=派系):

当我这么做的时候发生了:创建character1,创建character2完全相同的阵营(它只在数据库中出现一次),尝试删除character2。知道为什么吗

编辑2:忘记了一些重要的事情:

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

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

这应该可以。如果两个MyClass实例指向同一个另一个Class实例,则另一个Class表中将有一个条目,由两个MyClass条目引用


如果您看到许多其他类条目,这只能是因为您在运行时有许多不同的实例。如何定义另一个类的标识?您如何将MyClass实例与另一个Class实例关联?

请添加另一个Class的声明,并告诉我们如何将另一个Class的实例放入MyClass实例中。因此,另一个Class在persist时处于瞬态(如我在答复中所问),因此,它会按照API所说的,继续使用另一个。是的,首先调用getObjectById()来查找它,如果存在,则使用它;如果现在无法正常工作,则创建一个新的。谢谢你2!嗯,不,不。。。至少不是我想要的。。。
  @Persistent(dependent = "true")
  Faction faction;