我有 3 个 JPA 类Account
,其中包括一个Address
具有City
Object
public class Account implements java.io.Serializable {
// Fields
private Address address;
//Setters and getters for other fields
@OneToOne(fetch = FetchType.LAZY, mappedBy = "account")
public Address getAccountAddress() {
return this.address;
}
public void setAccountAddress(Address address) {
this.address = address;
}
public class Address implements java.io.Serializable {
// Fields
private City city;
//Setters and getters for other fields
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CityId", nullable = false)
public City getCity() {
return this.city;
}
我想解决 N+1 选择问题,我尝试在类上方使用 @BatchSize,但它并没有停止对数据库的 N+1 调用,因此我必须在我的persistence.xml
<property name="hibernate.default_batch_fetch_size" value="50" />
<property name="hibernate.jdbc.batch_size" value="50" />
现在它可以工作,除了一个实体Address
,所以我为 City 和 Account 获得了一个 SQL 选择,但我仍然为 Address 获得了 N 个 SQL 选择。我注意到唯一的区别是 Account 和 Address 之间的关系是一对一的
我的问题是:
- 一对一的关系可以成为我仍然在表地址上获得 N 选择的原因吗?为什么?
- 为什么注释不起作用(为什么我必须设置它
persistence.xml
),是否应该进行一些设置才能使注释生效?