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

Hibernate 具有非主键的JPA映射。两个表中的列名也不同,hibernate,jpa,mapping,Hibernate,Jpa,Mapping,比如说,有两个DB表 1.表A以主键作为辅助。A有一个按名称排序的列orderNo。 2.表B以主键作为投标。B有一个名为salesOrderNo的列 A.orderNo与B.salesOrderNo相同,而且对于表A中与特定orderNo对应的一个条目,表B中可能有许多条目具有相同的salesOrderNo 如何定义此OneToMany(EntityA:EntityB)关系 我尝试了以下方法,但遇到了一些问题: @Entity @Table(name = "A") public class A

比如说,有两个DB表 1.表A以主键作为辅助。A有一个按名称排序的列orderNo。 2.表B以主键作为投标。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;
}
@实体
@表(name=“A”)
公共类A实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“A_KEY”)
私人援助;
@列(name=“订单号”)
私有字符串orderNo;
@独身癖
@JoinColumn(referencedColumnName=“salesOrderNo”)
名单b;
}
@实体
@表(name=“B”)
公共类B实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“B_键”)
私人串投标;
@列(name=“销售订单号”)
私有字符串salesforderno;
@许多酮
@JoinColumn(referencedColumnName=“orderNo”)
@杰索尼奥雷
私人A;
}
我在应用程序启动期间看到的错误是:

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

在实体A中

@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name=“销售订单号”,referencedColumnName=“订单号”)
名单b;
在实体B中

@ManyToOne
@JoinColumn(name=“SALES\u ORDER\u NO”,referencedColumnName=“ORDER\u NO”,insertable=false,updateable=false)
@杰索尼奥雷
私人A;
这两个
@JoinColumn
的原因看起来相同,因为它们是相同的映射

如果联接用于使用外键映射策略的OneToOne或ManyToOne映射,则外键列位于源实体或可嵌入实体的表中

理解JPA映射的最佳方法是考虑表结构和希望JPA生成的SQL。在您的例子中,
B
的每一行都引用了
a
的某一行。但是
A
没有对
B
的任何引用。因此,在表
B
中有一个外键,在您的案例
SALES\u ORDER\u NO
中,它将引用表
a
中的一些列,在您的案例
ORDER\u NO
中。因此,无论您将
@JoinColumn
放在何处,都必须正确获取外键和引用键

由于
A
没有外键,您可以从实体
A
中删除
@JoinColumn
,并参考
B
中的映射,如下所示-


@OneToMany(fetch=FetchType.EAGER,mappedBy=“a”)
名单b;
为了查看它是否正确映射了实体,我使用EntityManager查询了这两个实体,并为实体A生成了以下SQL查询

选择
a0。一个键作为一个键1\u 0\u 0,
a0.订单号与订单号相同,
b1.销售订单号为销售订单号或2订单号,
b1.b_键作为b_键1_1_1_,
b1.b_键作为b_键1_1_2_,
b1.销售订单号为销售订单号或2订单号
从…起
a a0_
左外连接
b b1_
a0.订单号=b1.销售订单号
哪里
a0_u.a_u键=?
和实体B

选择
b0_u.b_键作为b_键1_1_0_u,
b0.销售\订单\编号为销售\或2 \ 1 \ 0,
a1.一个键作为一个键1,0,1,,
a1.订单号为订单号2\0\1
从…起
b b0_
左外连接
a 1_
在b0上销售订单号=a1订单号
哪里
b0_u.b_键=?

这似乎与您的描述相符。

谢谢,它起作用了!!请您添加一些解释,因为在这两个实体中看到@JoinColumn(name=“SALES\u ORDER\u NO”,referencedColumnName=“ORDER\u NO”),我有点困惑。我的意思是name和referencedColumnName在两端具有相同的值。