注释@BatchSize不起作用

时间:2013-09-16 08:40:59

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

我有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;
}

persistence.xml

我想解决N + 1选择问题,我尝试在类之上使用@BatchSize,但它没有停止对数据库的N + 1调用,因此我不得不在{{1}中设置batchSize }}

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

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

我的问题是:

  1. 这种关系可以一对一地成为我仍然在表格地址上进行N选择的原因吗?为什么?
  2. 为什么注释不起作用(为什么我必须在persistence.xml中设置它),是否应该进行一些设置以使注释有效?

1 个答案:

答案 0 :(得分:2)

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

  2. 您在哪个课程@BatchSize之上?你应该把它放在City类之上。同时在方法@BatchSize;

  3. 上方尝试getCity()