1

私はダービーで 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.setAnotherClass(anotherClass) のように MyClass インスタンスに入れます。したがって、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 を作成し (データベースには 1 回だけあります)、character2 を削除しようとします。理由はありますか?

EDIT2:重要なことを忘れました:

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

それが私のキャラクタークラスが言っていることです。キャラクターが使用していない場合、派閥を削除したいので、それを持っています。それが問題だと思いますか?どうすれば今それを行うことができますか?

4

1 に答える 1

0

これはうまくいくはずです。2 つの MyClass インスタンスが同じAnotherClass インスタンスを指している場合、AnotherClass テーブルには 1 つのエントリがあり、両方の MyClass エントリによって参照されます。

多数の AnotherClass エントリが表示されている場合は、実行時に多数の異なるインスタンスがあることが原因である可能性があります。AnotherClass の ID をどのように定義しますか? MyClass インスタンスを AnotherClass インスタンスにどのように関連付けていますか?

于 2010-12-14T11:04:13.400 に答える