У меня есть родительская таблица i.e. audit_log (parent), которая содержит один идентификатор столбца. Для данного идентификатора в audit_log у меня есть список идентификаторов поставщиков. Я храню их в отдельной таблице audit_log_vendorid (дочерняя таблица). Я хочу, чтобы дочерняя таблица получала идентификатор из родительской таблицы как один из столбцов (parent_id). Вот схема таблицы.Отображение родительского ребенка Hibernate JPA
audit_log
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | bigint(19) | NO | PRI | NULL | |
+-------+------------+------+-----+---------+-------+
audit_log_vendorid
+-----------+------------+------+-----+---------+----------------+
| 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 | |
+-----------+------------+------+-----+---------+----------------+
I'have определило мои классы 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_log_vendorid ниже. Я передаю идентификатор поставщика и ожидаю, что два других поля будут заполнены спящим режимом. Поле parent_id, которое я хочу в поле «id» в audit_log. Он инициализируется как null, поскольку теперь вызывает исключение ограничений 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;
}
}
Мне любопытно узнать, соответствуют ли мои аннотации. В основном я хочу, чтобы идентификатор из таблицы audit_log был заполнен в поле parent_id в таблице audit_log_vendorid с помощью hibernate.
Да audit_log_vendorid не является таблицей соединений. В чем причина обращения к AuditLog, сопоставленная с ManyToOne? Я думал, что однонаправленный OneToMany будет работать. Используя внешний ключ, указываем ли мы в спящий режим, что ему нужно извлечь значение для parent_id из столбца с ссылкой? Меняются вещи, если мой первичный ключ в таблице audit_log больше идентификатора? – skeptic01
Вы можете использовать однонаправленный OneToMany, но тогда столбец parent_id в audit_log_vendorid будет обрабатываться ассоциацией OneToMany (вам понадобится '@JoinColumn (" parent_id ")) и не должен отображаться второй раз в объекте AuditVendorPair. Если вам нужно получить доступ к родительскому объекту из объекта AuditVendorPair, тогда он должен быть двунаправленным. –