我有一个父表,即audit_log(父表),其中包含一个列id。对于audit_log中的给定id,我有一个供应商id列表。我将它们存储在单独的表audit_log_vendorid(子表)中。我希望子表从父表中获取id作为列之一(parent_id)。这是表模式。
审核日志
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | bigint(19) | NO | PRI | NULL | |
+-------+------------+------+-----+---------+-------+
审核日志
+-----------+------------+------+-----+---------+----------------+
| 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 | |
+-----------+------------+------+-----+---------+----------------+
我已经定义了我的hibernate类如下
@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;
}
}
下面是audit\u log\u vendorid的hibernate映射类。我传入一个供应商id,并希望其他两个字段由hibernate填充。我要从审核日志中的“id”字段获取的父id字段。它被初始化为空,导致mysql约束异常。
@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;
}
}
我很想知道我的注释是否正确。我基本上想让hibernate在audit_log_vendorid表的parent_id字段中填充audit_log表中的id。
最佳答案
不,他们不正确。audit_log_vendorid
不是联接表。联接表是未映射到实体的表,它包含映射到其他表的两个关联实体的id。
您也不应该在AuditVendorPair中有父id字段。这不仅是因为它不遵守Java命名约定,而且还因为它应该被一个对AuditLog的引用所替代,该引用映射为ManyToOne。
因此,简而言之,您应该有一个双向的OneToMany关联,如the documentation中所述映射。