使用@SecondaryTable注释进行JPA / Hibernate映射

时间:2014-11-04 07:48:40

标签: java mysql hibernate jpa

我有两张桌子:

part {
    int id; --> primary key, auto generated
    varchar poNo;
    varchar partNo;
    varchar partDesc;
    varchar eccNo;
    ...
}

supplement {
    int id; --> primary key
    varchar poNo; --> foreign key
    varchar partNo; --> foreign key
    varchar venderPartNo;
    varchar exportHSCCode;
    ...
}

我将一个实体定义如下:

@Entity
@Table(name="part")
@SecondaryTable(name="supplement", pkJoinColumns ={@PrimaryKeyJoinColumn="id"})
public class Part{
    @Id
    @GeneratedValue
    private Integer id;

    private String poNo;

    private String partNo;

    private String partDesc;

    private String eccNo;
    @Column(table="supplement")
    private String vernderPartNo;
    @Column(table="supplement")
    private String exportHSCCode;
    ...
    getter and setter...
}

问题1:

当我坚持一部分时,我不想在补充表中插入一行,是否有任何配置或注释可以得到它?因为根据上面的实体和配置,当我持久化一部分时,hibernate将为我生成两个插入SQL语句:

insert into part(poNo, partNo, partDesc, eccNo) values (?,?,?,?)
insert into supplement(vernderPartNo, exportHSCCode, id) vaules (?,?,?)

我想要的是,当坚持一部分时,我没有为任何补充文件设置值,然后只有一个插入声明:     插入部分(poNo,partNo,partDesc,eccNo)值(?,?,?,?)

有可能吗?

问题2:

从上面的表格式中,poNO和partNo是外键,这意味着,对于每个相关部分和补充,这两个字段应该具有相同的值。但是我不知道在使用上面的配置时如何将这两个列值映射到补充表。

对于Hibernate的正常操作,当它处理一个部分时,它总是生成两个我上面提到的insert语句,而对于辅助表,它的insert语句只包含那些指定了它的表名的字段,所以对于补充,它的插入声明是:

insert into supplement(vernderPartNo, exportHSCCode, id) vaules (?,?,?)

那么,有没有办法让Hibernate生成如下的insert语句:

insert into supplement(poNo, partNo, vernderPartNo, exportHSCCode, id) vaules (?,?,?,?,?)

2 个答案:

答案 0 :(得分:1)

使用@SecondaryTable

映射两个表

您可以像下面在主表上那样使用

@Table(name = "Table_Primary", schema = "schema ")
@SecondaryTable(name = "Table_Secondary", schema = "schema ", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "Table_Primary_Column", referencedColumnName = "Table_Secondary_Column")})

答案 1 :(得分:0)

1)尝试以下(我希望这可以工作,但Hibernate可能不会这样):

@Entity
@Table(name="part")
@SecondaryTable(name="supplement", pkJoinColumns ={@PrimaryKeyJoinColumn="id"})
public class Part{
    @Id
    @GeneratedValue
    private Integer id;

    private String poNo;

    private String partNo;

    private String partDesc;

    private String eccNo;
    @Column(table="supplement")
    @Basic(optional=true)
    private String vernderPartNo;
    @Column(table="supplement")
    @Basic(optional=true)
    private String exportHSCCode;
    ...
    getter and setter...
}

2)您需要更改键控部分的方式。您已将其主键定义为自动递增的整数...这将是补充表中的外键。这实际上是JPA希望你这样做的(我说这是因为JPA规范称自然键为“遗留”)。你有几个选择:

  1. 从Part实体中删除自动增量并创建一个仅包含poNo和partNo的“composite key”类,并将该类作为字段添加到Part。这将成为您的Part主键,并将成为补充表中使用的外键。
  2. 忘记外键,而是为这两列添加@UniqueConstraint到您的Part(这不会解决您的外键问题,但它会强制执行您确定的约束)