2017-01-31 4 views
0

У меня есть объект Hibernate следующим образом:Hibernate Ленивый объект без отношений

@Entity 
@Table(name="SOME_TABLE") 
public class SomeEntity { 

private Long id; 
private String someInfo; 

@Id 
@Column(name = "ID") 
public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

@Column(name = "SOME_INFO") 
public String getSomeInfo() { 
    return someInfo; 
} 

public void setSomeInfo(String someInfo) { 
    this.someInfo = someInfo; 
} 
} 

При загрузке объекта, используя следующий код:

sessionFactory.getCurrentSession().load(getEntityClass(), id); 

полей объекта не загружен, а прокси-сервер объект возвращается, и фактические поля загружаются только тогда, когда я их явным образом вызываю их методом getter. Насколько я знаю, простые поля (примитивы, строки) должны быть загружены с нетерпением. Почему поля, которые не являются отношениями или коллекциями, загружаются лениво? есть ли способ попросить Hibernate загрузить их с нетерпением? Это проблема для меня, поскольку я использую этот объект как возвращаемое значение приложения REST Spring, а затем получаю исключение could not initialize proxy - no Session.

+0

afaik, hibernate загружает свойства жадно по умолчанию. Это поведение можно изменить с помощью «улучшения байт-кода». Может ли это быть каким-то образом установленным по умолчанию в вашем проекте? проверьте этот ответ для обеспечения ленивой загрузки свойств http://stackoverflow.com/questions/19610085/using-lazy-for-properties-in-hibernate. – Mustafa

+0

Нет, мое приложение не настраивает улучшение байт-кода – zuckermanori

ответ

2

Причина, по которой вы получаете прокси-сервер, заключается в том, что договор Session#load разрешен для возврата прокси-сервера в качестве заполнителя без запроса базы данных для указанного объекта. Именно поэтому крайне важно, чтобы предоставленный идентификатор, для которого вы хотите загрузить, существует, так как вы столкнетесь с неожиданными ObjectNotFoundException ошибками позже, если это так.

Что вы хотите использовать, это Session#get, который гарантированно запросит базу данных и не вернет прокси-сервер, поэтому указанные вами основные атрибуты будут загружены так, как вы ожидали.

Например:

final Comment comment = new Comment("This is a comment"); 
comment.setOwner(session.load(Product.class, productId)); 
session.save(comment); 

Преимущество здесь в том, что Product не полностью инициализирован. Мы создаем постоянный прокси с указанным значением productId и свяжем его как владельца комментария. Этого достаточно, если мы сохраняем новый Comment, чтобы сделать связь с внешним ключом без фактической загрузки состояния Product, избегая ненужных накладных расходов.

+0

Спасибо @Нарос это то, что я пропустил – zuckermanori

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