有两个数据库表,例如 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的列。
答案 0 :(得分:0)
在实体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
的原因看起来相同,因为它们是相同的映射。
如果联接是针对使用外键映射策略的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=?
似乎符合您的描述。