2014-12-22 4 views
0

Я работаю с Hibernate и попытаться оптимизировать загрузку зарубежных объекты аннотированных сКак переопределить загрузку LAZY после закрытия сессии?

@ManyToOne(fetch = FetchType.LAZY) 

Я не хочу, чтобы получить иностранное юридическое лицо во время спящего режима запроса и использовать Lazy типа выборки. Позже (после того, как сессия уже закрыта), я хочу получить эту внешнюю сущность, но использовать инструмент, отличный от спящего режима (другой кэшированный DAO (GuavaCache), который уже хранит иностранный объект).

Из козы, сразу у меня возникло исключение LazyInitializationException.

Я не могу заменить аннотацию @ManyToOne @Transient из-за toooooo много устаревшего кода HQL, который не работает после удаления @MabyToOne.

Somewere кто-то посоветовал сделать геттер окончательный и не имеют доступа к сущности поля прямолинейно, а просто использовать поглотитель. Вот пример:

private int foreignId; 

@Basic 
@Column(name = "foregn_id") 
public int getForeignId() { return foreignId;} 
public void setForeignId(int id) { this.foreignId = id; } 


// private DBForeignEntity foreignEntity; no more sense to have this field 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "foregn_id", referencedColumnName = "id", nullable = false, insertable = false, updatable = false) 
public final DBForeignEntity getForeign() { 
    // return foreignEntity; deprecated usage! Hibernate will create proxy object and throw LazyInitException after session was closed 
    return getFromCache(getForeignId()); 
} 

public void setForeign(DBForeignEntity foreignEntity) { 
    // this.foreignEntity = foreignEntity; no more sence for having setter at all 
} 

это некрасиво решение exludes любые способности сохраняются вложенные объекты, из-за отсутствия сеттера для иностранного лица больше!

Есть ли еще одно решение для отказа от Hibernate для создания прокси-объекта для моего объекта? Как избежать LazyInitializationException, если сеанс закрыт? Есть ли какие-либо плохие последствия не-прокси в этом случае?

+0

какие-либо предложения? – user2602807

+0

Таким образом, в основном, когда вы выбираете связанный объект, вы не хотите использовать тот же сеанс-фабрику, вы имеете в виду другое хранилище данных (возможно, такое же, но с помощью другого механизма-guava). Если это так, то я думаю, вам нужно будет сделать связь между основным и связанным сущностью вручную. Не совсем уверен в проблеме, поэтому записывайте ее как комментарий вместо ответа. – Atul

+0

Что это значит? «... установить связь между первичным и связанным сущностью вручную» Как это должно выглядеть? – user2602807

ответ

0

В текущей ситуации hibernate проксирует только дочерний объект (foreignEntity) и не проксирует текущий (родительский) объект. Таким образом, нет никаких проблем, чтобы проверить экземпляр иностранной компании и заменить его обычаем загружен:

private int foreignId; 

@Basic 
@Column(name = "foregn_id") 
public int getForeignId() { return foreignId;} 
public void setForeignId(int id) { this.foreignId = id; } 

private DBForeignEntity foreignEntity; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "foregn_id", referencedColumnName = "id", nullable = false, insertable = false, updatable = false) 
public final DBForeignEntity getForeignEntity() { 
    if (foreignEntity instanceof HibernateProxy) { 
     foreignEntity = getFromCache(foreignId); 
    } 
    return foreignEntity; 
} 

public void setForeign(DBForeignEntity foreignEntity) { 
    this.foreignEntity = foreignEntity; 
} 

Кроме того, не существует LazyInitException при вызове

DBParentEntity.getForeignEntity() 
Смежные вопросы