Вы можете добавить lazy="false"
к сопоставлению «многие к одному», которое будет загружать пользователей при загрузке ForumMessage.В качестве альтернативы вы можете инициализировать список пользователей, используя Hibernate.initialize ().Просто убедитесь, что вы делаете это, прежде чем закрыть сеанс.
Session session = gileadHibernateUtil.getSessionFactory().openSession();
string sql = "from ForumMessage";
Query query = session.createQuery(sql);
List results = query.list()
for(ForumMessage message : results)
{
Hibernate.initialize(message.User);
}
return new LinkedList <ForumMessage>(results);
Вы должны сделать только один из них, если вам это нужно.Hibernate по умолчанию ленивый загружает объекты, чтобы избежать ненужных вызовов в базу данных.Например:
public LinkedList getMessages()
{
//It's assumed the session is opened and closed elsewhere.
string sql = "from ForumMessage";
Query query = session.createQuery(sql);
List results = query.list();
//The overhead of extra calls to the database occur here.
//This would have a similar impact if lazy load is set to false.
for(ForumMessage message : results)
{
Hibernate.initialize(message.User);
}
return new LinkedList <ForumMessage>(results);
}
public void printMessages()
{
LinkedList messages = getMessages();
for(ForumMessage message : messages)
{
System.out.println(message.ForumMessage);
}
}
В приведенном выше примере кода возникают накладные расходы на загрузку всех объектов Users, но эти объекты никогда не используются.Если бы использовалась ленивая загрузка Hibernate, то эти дополнительные издержки не возникли бы.В следующем примере список пользователей не загружается, пока этот список не используется.Таким образом, вызовы в базу данных не выполняются до тех пор, пока данные действительно не потребуются.
public LinkedList getMessages()
{
//It's assumed the session is opened and closed elsewhere.
string sql = "from ForumMessage";
Query query = session.createQuery(sql);
List results = query.list();
return new LinkedList <ForumMessage>(results);
}
public void printMessages()
{
LinkedList messages = getMessages();
for(ForumMessage message : messages)
{
//Hibernate will load the users objects here when they are accessed.
for(Users user : message.User)
{
System.out.println(user);
}
}
}
Следует обратить внимание на один момент, когда ленивая загрузка - это вся загрузка, которая должна выполняться в активном сеансе.Если у вас нет активного сеанса и вы пытаетесь получить доступ к чему-то, что еще не было загружено, Hibernate выдаст LazyInitializationException
.
Кроме того, использование функции отложенной загрузки Hibernate больше соответствует идее невежества постоянства, тогда как использование Hibernate.initialize () - нет.