有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有@SecondaryTable注释的java JPA/Hibernate映射

我有两张桌子:

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

我想知道的是,当持久化一个部分时,我没有为任何补编字段设置值,然后只有一个insert语句: 插入零件(poNo、零件号、零件描述、eccNo)值(?、、?、?)

可能吗

问题2:

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

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

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

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

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

共 (2) 个答案

  1. # 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. # 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. 从零件实体中删除autoincrement并创建一个仅包含poNo和partNo的“composite key”类,然后将该类作为字段添加到零件中。这将成为您的部件主键,并将成为您的补充表中使用的外键
    2. 忘记外键,而是为这两列的零件添加一个@UniqueConstraint(这不会解决外键问题,但会强制执行您确定的约束)