【问题标题】:Annotation @BatchSize not working注释@BatchSize 不起作用
【发布时间】:2013-09-20 08:24:21
【问题描述】:

我有 3 个 JPA 类,一个 Account,其中包括一个 Address,它有一个 City 对象

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 中设置 batchSize

 <property name="hibernate.default_batch_fetch_size" value="50" />
 <property name="hibernate.jdbc.batch_size" value="50" />

现在除了Address 的一个实体之外它可以工作,所以我为城市和帐户获得了一个 SQL 选择,但我仍然为地址获得了 N 个 SQL 选择。我注意到唯一的区别是Account和Address之间的关系是一对一的

我的问题是:

  1. 一对一的关系能否成为我仍然在表地址上获得 N 选择的原因?为什么?
  2. 为什么注释不起作用(为什么我必须在persistence.xml 中设置它),是否需要进行一些设置才能使注释生效?

【问题讨论】:

    标签: hibernate jpa annotations one-to-one select-n-plus-1


    【解决方案1】:
    1. Hibernate 可为空(可选)OneToOne 不能是惰性的。有很多关于这个问题的文章和一些解决方法。例如。阅读此Making a OneToOne-relation lazy

    2. 你把@BatchSize放在了哪些类之上?你应该把它放在City 类之上。也可以试试@BatchSize上面的方法getCity()

    【讨论】:

    • 仅供参考,在getCity()getAccountAddress()(或我系统中的等效项)上添加@BatchSize 似乎不起作用。
    猜你喜欢
    • 2021-06-03
    • 2020-11-19
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2020-10-09
    • 2012-09-19
    • 2015-09-14
    • 2017-08-20
    相关资源
    最近更新 更多