一方の関係から他のテーブルへのデータの挿入と、同時に関係の反対側への挿入に問題があります
私は持っています: ユーザーエンティティを持つテーブルユーザー
@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 アノテーションを使用できるかもしれません。
ありがとうございました。