具有非主键的JPA映射。两个表中的列名也不同

有两个数据库表,例如 1.表A,主键为aId。 A的名称为orderNo。 2.表B,主键为bId。 B有一个名为salesOrderNo的列。

A.orderNo与B.salesOrderNo相同,并且,对于表A中与特定orderNo相对应的一个条目,表B中可以有许多条目具有相同的salesOrderNo。

如何定义OneToMany(EntityA:EntityB)关系。

我尝试了以下操作,但遇到了问题:

@Entity
@Table(name = "A")
public class A implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "A_KEY")
    private String aId;

    @Column(name = "ORDER_NO")
    private String orderNo;

    @OneToMany
    @JoinColumn(referencedColumnName = "salesOrderNo")
    List<B> b;
}

@Entity
@Table(name = "B")
public class B implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "B_KEY")
    private String bId;

    @Column(name="SALES_ORDER_NO")
    private String salesOrderNo;

    @ManyToOne
    @JoinColumn(referencedColumnName = "orderNo")
    @JsonIgnore
    private A a;
}

我在应用程序启动过程中看到的错误是:

调用init方法失败;嵌套的异常是org.hibernate.MappingException:无法在org.hibernate.mapping.Table(A)及其相关的超表和辅助表中找到逻辑名称为orderNo的列。

zk79281988 回答:具有非主键的JPA映射。两个表中的列名也不同

在实体A中,

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "SALES_ORDER_NO",referencedColumnName = "ORDER_NO")
List<B> b;

在实体B中,

@ManyToOne
@JoinColumn(name = "SALES_ORDER_NO",referencedColumnName = "ORDER_NO",insertable = false,updatable = false)
@JsonIgnore
private A a;

两个@JoinColumn的原因看起来相同,因为它们是相同的映射。

documentation

  

如果联接是针对使用外键映射策略的OneToOne或ManyToOne映射的,则外键列在源实体的表中或可嵌入。

理解JPA映射的最佳方法是考虑表结构和要JPA生成的SQL。在您的情况下,B的evey行引用了A的某一行。但是A没有对B的引用。因此,在表B中将有一个外键,在您的情况下SALES_ORDER_NO将有一个外键,在您的情况下A将引用表ORDER_NO中的某些列。因此,无论您将@JoinColumn放在何处,都必须正确获取外键和参考键。

由于A没有外键,因此您可以从实体@JoinColumn中删除A,并像这样引用在B中完成的映射-


@OneToMany(fetch = FetchType.EAGER,mappedBy = "a")
List<B> b;

要查看它是否确实正确映射了实体,我使用实体管理器查询了两个实体,并为实体A生成了以下SQL查询

    select
        a0_.a_key as a_key1_0_0_,a0_.order_no as order_no2_0_0_,b1_.sales_order_no as sales_or2_1_1_,b1_.b_key as b_key1_1_1_,b1_.b_key as b_key1_1_2_,b1_.sales_order_no as sales_or2_1_2_ 
    from
        a a0_ 
    left outer join
        b b1_ 
            on a0_.order_no=b1_.sales_order_no 
    where
        a0_.a_key=?

对于实体B

    select
        b0_.b_key as b_key1_1_0_,b0_.sales_order_no as sales_or2_1_0_,a1_.a_key as a_key1_0_1_,a1_.order_no as order_no2_0_1_ 
    from
        b b0_ 
    left outer join
        a a1_ 
            on b0_.sales_order_no=a1_.order_no 
    where
        b0_.b_key=?

似乎符合您的描述。

本文链接:https://www.f2er.com/3167710.html

大家都在问