2014-11-04 57 views
0

JPA/Hibernate映射我有两个表:与@SecondaryTable注释

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 (?,?,?) 

,我想是,坚持一个部分的时候,我没有对任何申请设定值补充的,那么只有一个INSERT语句:(?,?,?,) INSERT INTO部分(PONO,PARTNO,partDesc,eccNo)值

这可能吗?

问题2:

从上面的表架构中,PONO和PARTNO是外键,这意味着,每一个相关的部分和补充,这两个场应该具有相同的值。但是我不知道如何在使用上面的配置时将这两列值映射到补充表。

对于Hibernate的正常运行,当它处理一个部分时,它总是生成两个我上面提到的insert语句,而对于secondary表,它的insert语句只包含那些指定了它的表名的字段,所以为补充,它的INSERT语句:

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

那么,有没有有什么办法可以让Hibernate生成如下插入语句:

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

对于第一个问题,我在之前的测试中犯了一个错误,并且我发现使用@SecondaryTable已经可以解决它,只是没有为补充表设置任何字段的值,然后hibernate会跳过插入记录到这个表。 – Aaron 2014-11-11 11:09:16

回答

0

1)请尝试以下(我希望它可以工作,但Hibernate可能不会pl唉这种方式):

@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. 请从部分实体的自动增量营造“composite key”类只是PONO和PARTNO,并添加类的字段部分。这将成为你的Part主键,并且将成为你的补充表中使用的外键。
  2. 忘记外键,而是添加@UniqueConstraint到您的部分对于那些两列(这不会解决你的外键的问题,但它确实执行你所确定的约束)
+0

谢谢你回答我。对于问题1,我尝试了你的建议,但不幸的是,它没有奏效。它仍然有一个插入语句来插入一行来补充。对于问题2,第一个选项可能是一个解决方案,但它不适合我的项目。 – Aaron 2014-11-04 09:11:49