私は親テーブル、すなわち、単一の列IDを含むaudit_log(親)を持っています。 audit_logの特定のIDに対して、私はベンダーIDのリストを持っています。私は別のテーブルaudit_log_vendorid(子テーブル)にそれらを格納しています。私は、子テーブルが親テーブルからid(parent_id)の1つを取得するようにします。テーブルスキーマは次のとおりです。Hibernate JPA親子マッピング
AUDIT_LOG audit_log_vendoridため
@Entity
@Table(name="audit_log")
public class AuditLog {
private List<AuditVendorPair> vendorIDs;
public AuditLog(List<AuditVendorPair> vendorIds) throws Exception {
this.vendorIDs = vendorIDs;
}
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name = "audit_log_vendorid",
joinColumns = { @JoinColumn(name = "parent_id", referencedColumnName="id") })
public List<AuditVendorPair> getVendors() {
return vendorIDs;
}
@Id @Column(name="ID")
public Long getId() {
return super.getId();
}
public void setHostServices(List<AuditVendorPair> vendorIDs){
this.vendorIDs = vendorIDs;
}
}
マイHibernateマッピングクラスを以下のようにI'haveが私の休止状態のクラスを定義し
+-----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+----------------+
| id | bigint(19) | NO | PRI | NULL | auto_increment |
| vendor_id | bigint(19) | NO | | NULL | |
| parent_id | bigint(19) | NO | | NULL | |
+-----------+------------+------+-----+---------+----------------+
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | bigint(19) | NO | PRI | NULL | |
+-------+------------+------+-----+---------+-------+
audit_log_vendoridは以下の通りです。私はベンダーIDを渡し、他の2つのフィールドに休止状態が設定されることを期待します。 parent_idフィールドは、audit_logの "id"フィールドから取得します。これは現在mysqlの制約例外を引き起こしているので、nullとして初期化されています。
@Entity
@Table(name="audit_log_vendorid")
public class AuditVendorPair {
private Long id;
private Long parent_id;
private Long vendor_id;
public AuditVendorPair(Long vendor_id){
this.vendor_id = vendor_id;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
public Long getId(){
return id;
}
public void setId(Long id){
this.id = id;
}
@Column(name="vendor_id")
public Long getVendorID() {
return vendor_id;
}
public void setVendorID(Long vendor_id){
this.vendor_id = vendor_id;
}
@Column(name="parent_id")
public Long getParentId() {
return parent_id;
}
public void setParentId(Long parentID){
this.parent_id = parentID;
}
}
私の注釈が正しいかどうか不思議です。私は基本的には、audit_logテーブルのidを、hibernateによってaudit_log_vendoridテーブルのparent_idフィールドに設定したいと考えています。
はいaudit_log_vendoridは結合テーブルではありません。 ManyToOneでマップされたAuditLogを参照する理由は何ですか?私は単方向のoneToManyが動作すると思った。外部キーを使用して、参照された列からparent_idの値をフェッチする必要があることを休止状態にしていますか? audit_logテーブルのプライマリキーがIDを超えていると状況は変わりますか? – skeptic01
一方向のOneToManyを使用できますが、audit_log_vendoridのparent_id列はOneToManyアソシエーション( '@JoinColumn(" parent_id ")'が必要です)によって処理され、AuditVendorPairエンティティで2回目にマッピングされるべきではありません。 AuditVendorPairエンティティから親にアクセスする必要がある場合は、双方向である必要があります。 –