我有两个表:
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会为我生成两个insert 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 (?,?,?,?,?)
用@SecondaryTable
映射两个表
你可以在主表上使用如下
@Table(name = "Table_Primary", schema = "schema ")
@SecondaryTable(name = "Table_Secondary", schema = "schema ", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "Table_Primary_Column", referencedColumnName = "Table_Secondary_Column")})
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规范将自然密钥称为"遗留")。这里有几个选项:
- 从Part实体中删除autoincrement,创建一个只有poNo和partNo的"composite-key"类,并将该类作为字段添加到Part中。这将成为您的Part主键,并将成为您补充表中使用的外键
- 忘记外键,而是为这两列在Part中添加@UniqueConstraint(这不会解决外键问题,但会强制执行您确定的约束)