2013-09-16 5 views
1

У меня 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 для адреса. Я заметил, что единственное различие заключается в том, что отношения между счетами и адресом один к одному

Моих вопросов:

  1. Может отношение один к одному быть причиной, почему я все еще получая N, выберите в таблице адрес? и почему?
  2. Почему работа с аннотацией (почему я должен установить ее в persistence.xml), есть ли какие-то настройки, которые должны быть сделаны для того, чтобы аннотация была эффективной?

ответ

2
  1. Спящий обнуляемым (необязательно) OneToOne не может быть ленивым. Там много статей об этой проблеме и нескольких обходных решениях. Например. прочитайте это Making a OneToOne-relation lazy

  2. Выше классов, которые вы положили @BatchSize? Вы должны положить его выше класса City. Также попробуйте @BatchSize выше метода getCity();

+0

FYI, добавляя '@ BatchSize' на' getCity() 'или' getAccountAddress() '(или эквивалент этого в моей системе), кажется, не работает. –

Смежные вопросы