0

一方の関係から他のテーブルへのデータの挿入と、同時に関係の反対側への挿入に問題があります

私は持っています: ユーザーエンティティを持つテーブルユーザー

@Entity
@Column(name="USER")
public class User{


private int id;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


@ManyToMany
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@JoinTable(name="USER_CARS_JOINTABLE", 
                joinColumns=@JoinColumn(name="USER_ID"),
                inverseJoinColumns=@JoinColumn(name="CARS_ID"))
public Cars userCars;

//set and get methods omitted

}

Cars エンティティを含むテーブル CARS

@Entity
   @Column(name="CARS")
   public class Cars{

    private int dateId;

    @Id
    @GeneratedValue(strategy=IDENTITY)
    @Column(name="DATE_ID")
    public int getDateId() {
        return dateId;
    }

    public void setDateId(int dateId) {
        this.dateId = dateId;
    }


   @ManyToMany
   @Cascade(org.hibernate.annotations.CascadeType.ALL)
   @JoinTable(name="USER_CARS_JOINTABLE", 
               joinColumns=@JoinColumn(name="CARS_ID"),
               inverseJoinColumns=@JoinColumn(name="USER_ID"))

   public User username;

   //set and get methods omitted

   }

ご覧のとおり、USER テーブルと Cars テーブルの FK を含む JoinTable "USER_CARS_JOINTABLE" が USER と CARS の間にあります。

また、テーブルの説明とエンティティ クラスの名前を説明にします。

@Entity
  @Column(name="DESCRIPTION")
  public class Description{

  private int id;

    @Id
    @GeneratedValue(strategy=IDENTITY)
    @Column(name="ID")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }


  private String color;
  private String size;
  private String speed;
  private String type;

  //set and get methods omitted

  }

私の JoinTable USER_CARS_JOINTABLE は次のとおりです。

USER_ID INT NOT NULL, CARS_ID INT NOT NULL, DESCRIPTION_ID INT NOT NULL, PRIMARY KEY(INSTITUTION_ID, DATE_ID, SRC_ID), CONSTRAINT FK_USER_ID_IN_USER_CARS FOREIGN KEY(USER_ID) REFERENCES USER(ID), CONSTRAINT FK_CARS_ID_IN_USER_CARS FOREIGN KEY(CARS_ID) REFERENCES CARS 、制約 FK_DESCRIPTION_ID_IN_USER_CARS FOREIGN KEY(DESCRIPTION_ID) REFERENCES DESCRIPTION(ID)

私の場合、ユーザーは多数の車を持つことができ、1 つのタイプの車は多数のユーザーに属することができます。また、同じ車が異なる説明を持つことができます。クラス Description と User Entity と Cars Entity の間には、Undirectional、JoinTable、OneToMany の関係があります。つまり、Classes User と Cars は Description クラスを認識しますが、Description は User と Cars を認識しません。ユーザー側からクラス Cars とクラス Description にデータをデータベースに挿入しようとすると、次のような例外が発生します。

Hibernate: USER_CARS_JOINTABLE (User_ID, Description) 値 (?, ?) に挿入します エラー: org.hibernate.util.JDBCExceptionReporter - フィールド 'Cars_ID' にデフォルト値がありません エラー: org.hibernate.event.def.AbstractFlushingEventListe ner -データベースの状態をセッションと同期できませんでした

車側からこれを行うと、次のようなエラーが発生します。

Hibernate: USER_CARS_JOINTABLE (Cars_ID, Description) 値 (?, ?) に挿入します エラー: org.hibernate.util.JDBCExceptionReporter - フィールド 'User_ID' にデフォルト値がありません エラー: org.hibernate.event.def.AbstractFlushingEventListe ner -データベースの状態をセッションと同期できませんでした

これは、JoinTable USER_CARS_JOINTABLE の一部の外部キーが ID を取得しなかったことを意味します。なぜなら、この結合可能な USER_CARS_JOINTABLE にデータを生成または挿入できない側から挿入しているためです。

User_ID や Cars_ID などの外部キーの一部の JoinTable データベース スキーマに DEFAULT "number" を追加すると、それは機能しますが、挿入データですが、常に同じ Number を DEFAULT で挿入し、"number" に入れます。 . しかし、私が望むのは、joinTable USER_CARS_JOINTABLE の外部キーの問題の 1 つに、親テーブル User または Cars と同じ値を与えることです!!! Entity クラスの JoinTable に Hibernate の @Generator アノテーションを使用できるかもしれません。

ありがとうございました。

4

3 に答える 3

0

あなたのマッピングは間違っています。双方向の関連付けには、常に所有者側と逆側があります。両側を所有者側にしました。逆側にはマッピング情報 (結合テーブル、結合列) を含めてはならず、次のmappedBy属性を使用して逆側としてマークする必要があります。

@ManyToMany(cascade = CascadeType.ALL, mappedBy = "userCars")
private User username;

コードには他にもいくつかの問題があることに注意してください。

  • ネーミングが悪い。車の名前は Car にする必要があります。ユーザー名はユーザーという名前にする必要があります。userCars は cars という名前にする必要があります。
  • ユーザー名フィールドは公開ではなく非公開にする必要があります
  • 注釈は常にフィールド上にあるか、常にゲッター上にある必要があります。両方のプレースメント タイプを混在させることはできません。その場合、それらの半分は Hibernate によって無視されます。
于 2013-05-18T10:51:24.217 に答える
0

あなたの問題は、戦略 IDENTITY を使用して ID を生成しているためだと思います。代わりに、これを AUTO に設定してみてください。

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
于 2013-05-18T19:38:19.107 に答える