0

私は休止状態を使用しており、データ モデルでは 2 つの異なる場所で Hibernate.Inheritence Single-Table を使用していますが、相互に反応するときに問題があります。この例で単純化してみましょう。

基本的に何が起こるかというと、letter.setWord(word) を実行して保存すると、その単語には文字への参照がありません。マップされたByの私の理解から、両端で明示的に設定して保存する必要はありませんか? データベースを見ると、参照している Word の GUID でフィールドが適切に設定されています。私は何か間違ったことをしていますか?

補足: ゲッターに注釈を付けた理由は、それらがグローバル変数に直接配置されている場合、休止状態がそれらをまったく取得しないためです。(Letter から拡張されたクラスに主キー エラーが設定されていませんでした)。休止状態は、相互に参照する複数の継承テーブルを処理しませんか? 継承テーブルが 1 つしかない場合、グローバル変数に直接注釈を付けると、すべてが正常に機能します。

ありがとう、マイク

@Entity
@Table(name="Letter")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name = "LETTER_TYPE",  
    discriminatorType=DiscriminatorType.STRING)
public abstract class Letter {

   private String id;

   private String value;

   private Word word;

   @Id
   @GeneratedValue(generator = "uuid")
   @GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDHexGenerator")
   @Access(AccessType.PROPERTY)
   public String getId() {
       return id;
   }

   @Column(name = "VALUE")
   @Access(AccessType.PROPERTY)
   public String getValue() {
         return value;
   }

   @ManyToOne
   @JoinColumn(name = "WORD_ID")
   @Access(AccessType.PROPERTY)
   public Word getWord() {
        return word;
   }

          ********BASIC SETTERS WITH NO ANNOTATIONS********
}

 @Entity
@Table(name="Word")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name = "WORD_TYPE",  
    discriminatorType=DiscriminatorType.STRING)
public abstract class Word {

   private String value;

   private List<Letter> letters;

   private String id;

   @Id
   @GeneratedValue(generator = "uuid")
   @GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDHexGenerator")
   @Access(AccessType.PROPERTY)
   public String getId() {
       return id;
   }

   @Column(name = "VALUE")
   @Access(AccessType.PROPERTY)
   public String getValue() {
         return value;
   }

  @OneToMany(mappedBy="word")
  @Cascade({CascadeType.ALL})
  @Access(AccessType.PROPERTY)
   public List<Letter> getLetters() {
        return letters;
   }

        ***************BASIC SETTERS WITH NO ANNOTATIONS**********
}
4

1 に答える 1

0

あなたの理解は間違っています。変更するエンティティの正しいメモリ状態を維持する責任があります。Hibernate は自動的に新しいオブジェクトを移動して、反対側のメモリ内エンティティに追加しません。

于 2012-11-30T19:52:41.727 に答える