2013-03-27 2 views
1

У меня есть постоянный класс, который содержит отношения ManyToOne с моей пользовательской таблицей для целей аудита. На самом деле, все мои классы имеют эти поля, даже класс User.Hibernate ManyToOne/N + 1 Issue

public class MyClass implements Serializable { 

@Fetch(value=FetchMode.SELECT) 
@ManyToOne(optional=false, fetch=FetchType.LAZY) 
@NotFound(action = NotFoundAction.IGNORE) 
@JoinColumn(name = "CREATE_USER_ID") 
public User getCreatedBy() { 
    return createdBy; 
} 

@Fetch(value=FetchMode.SELECT) 
@ManyToOne(optional=false) 
@NotFound(action=NotFoundAction.IGNORE) 
@JoinColumn(name="USER_ID") 
public User getLastUpdatedBy() { 
    return lastUpdatedBy; 
} 
} 

Просто сделать это еще лучше, некоторые каштановый сделаны поля аудита в большинстве таблиц полукокса (8), но поле в T_USER VARCHAR2, (8), а это означает, что внешний ключ не может создаваться на них.

Anyhoo, запрос для MyClass будет запускать запросы для заполнения полей аудита, которые затем, в свою очередь, вызывают запрос для заполнения поля аудита пользователя.

Мне редко нужны поля аудита, поэтому я хочу сделать их ленивыми. К сожалению, я думаю, что у меня много работы против меня, не в последнюю очередь из-за плохо разработанной схемы.

Может ли кто-нибудь помочь мне здесь?

Джейсон

ответ

2

Похоже, что @Fetch (значение = FetchMode.SELECT) аннотацию и @ManyToOne (опция = ложь, принеси = FetchType.LAZY) будут сражаться друг против друга, вы пробовали удаление @Fetch (значение = FetchMode.SELECT) для каждого объекта и добавление fetch = FetchType.LAZY в обе ассоциации?

Другая причина может заключаться в том, что аннотация @NotFound ведет борьбу с необязательным параметром = false аннотации. Один говорит, что может быть NULL, где другой говорит, что не может. Я считаю, что в случае, когда вы можете иметь нулевое значение в ассоциации * toOne, вы не можете иметь ленивую загрузку, если ассоциация не может быть NULL.

+0

Пробовал это без везения. Я делал предположение, что нехватка внешних ключей ушибала мою способность ленить загружать отношения ManyToOne. – Jason

+0

Хорошо, я обновил свой ответ с другим предложением. –

+1

Я принял ваш ответ. По дальнейшим исследованиям, похоже, что NotFound выполняет дополнительный запрос. Я хотел бы иметь лучшее из обоих миров, где ManyToOne может быть нулевым, но NotFound не будет запускать дополнительный запрос. – Jason