У меня 3 JPA классы в Account
, который включает в себя один Address
, который имеет City
ObjectАннотация @BatchSize не работает
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
, поэтому я получаю один SQL-выбор для Сити и для учетной записи, но я все же получаю выбор N SQL для адреса. Я заметил, что единственное различие заключается в том, что отношения между счетами и адресом один к одному
Моих вопросов:
- Может отношение один к одному быть причиной, почему я все еще получая N, выберите в таблице адрес? и почему?
- Почему работа с аннотацией (почему я должен установить ее в
persistence.xml
), есть ли какие-то настройки, которые должны быть сделаны для того, чтобы аннотация была эффективной?
FYI, добавляя '@ BatchSize' на' getCity() 'или' getAccountAddress() '(или эквивалент этого в моей системе), кажется, не работает. –