【问题标题】:JPA/Hibernate mapping with @SecondaryTable annotation带有 @SecondaryTable 注释的 JPA/Hibernate 映射
【发布时间】:2014-11-04 07:48:39
【问题描述】:

我有两张桌子:

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...
}

问题一:

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

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

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

有可能吗?

问题 2:

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

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

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

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

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

【问题讨论】:

  • 第一个问题,我之前的测试出错了,我发现使用@SecondaryTable已经可以解决了,只是没有为补充表的任何字段设置值,然后hibernate会跳过将记录插入此表。

标签: java mysql hibernate jpa


【解决方案1】:

@SecondaryTable映射两个表

你可以像下面这样在主表上使用

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

【讨论】:

    【解决方案2】:

    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 到您的部分(这不会解决您的外键问题,但它会强制执行您确定的约束)

    【讨论】:

    • 感谢您回答我。对于问题1,我按照您的建议尝试了,但不幸的是,它没有用。它仍然有一个插入语句来插入一行来补充。对于问题2,第一个选项可能是一个解决方案,但它不适合我的项目。
    猜你喜欢
    • 2017-09-20
    • 2023-03-22
    • 2014-09-07
    • 2017-06-06
    • 2016-01-04
    • 2022-12-03
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多