java - Hibernate JPA 父子映射

标签 java mysql spring hibernate jpa

我有一个父表,即audit_log(parent),其中包含单个列id。对于audit_log 中给定的ID,我有一个供应商ID 列表。我将它们存储在单独的表audit_log_vendorid(子表)中。我希望子表从父表获取 id 作为列之一(parent_id)。这是表架构。

审核日志

+-------+------------+------+-----+---------+-------+
| 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    |                |
+-----------+------------+------+-----+---------+----------------+

我已经定义了我的 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的hibernate映射类如下。我传入供应商 ID 并期望其他两个字段由 hibernate 填充。我想要来自audit_log中的“id”字段的parent_id字段。目前已初始化为 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;
}
}

我很想知道我的注释是否正确。我基本上希望 hibernate 将audit_log 表中的id 填充到audit_log_vendorid 表的parent_id 字段中。

最佳答案

不,他们不正确。 audit_log_vendorid 不是连接表。连接表是未映射到实体的表,它包含映射到其他表的两个关联实体的 ID。

AuditVendorPair 中也不应该有parent_id 字段。不仅因为这不遵守 Java 命名约定,还因为它应该被替换为对 AuditLog 的引用,并使用 ManyToOne 进行映射。

因此,简而言之,您应该有一个双向 OneToMany 关联,如 the documentation 中所述进行映射。 .

关于java - Hibernate JPA 父子映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40731536/

相关文章:

php - 已编译的 PHP 7 在 WordPress 中缺少 mysql 扩展

mysql - 通过远程控制台连接azure的 "MySQL in app"数据库

java - 获取 Spring 属性占位符及其解析值的列表

java - RequestContextHolder.getRequestAttributes() 第二次调用返回 null

java - 我在 Java 中以正确的方式执行 getters/setters 吗?

java - 嵌套哈希表?

java - Android 应用程序在创建打开 Intent 时崩溃

MYSQL:用户标识的计数类型

java - 使用 JAVA 进行正则表达式过滤

java - 加入 hql hibernate 的预期路径