Java Hibernate未加载关联对象
我正在尝试加载hibernate对象ForumMessage,但其中包含另一个对象Users,并且未加载Users对象 我的ForumMessage映射文件:Java Hibernate未加载关联对象,java,hibernate,orm,Java,Hibernate,Orm,我正在尝试加载hibernate对象ForumMessage,但其中包含另一个对象Users,并且未加载Users对象 我的ForumMessage映射文件: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Jan 4, 2011 10:10:29 AM by Hibernate Tools 3.4.0.Beta1 -->
<hibernate-mapping>
<class name="com.BiddingSystem.Models.ForumMessage" table="FORUMMESSAGE">
<id name="ForumMessageId" type="long">
<column name="FORUMMESSAGEID" />
<generator class="native" />
</id>
<property name="ForumMessage" type="java.lang.String">
<column name="FORUMMESSAGE" />
</property>
<many-to-one name="User" class="com.BiddingSystem.Models.Users" fetch="join">
<column name="UserId" />
</many-to-one>
<property name="DatePosted" type="java.util.Date">
<column name="DATEPOSTED" />
</property>
<many-to-one name="Topic" class="com.BiddingSystem.Models.ForumTopic" fetch="join">
<column name="TopicId" />
</many-to-one>
</class>
</hibernate-mapping>
我使用以下代码:
Session session = gileadHibernateUtil.getSessionFactory().openSession();
SQL="from ForumMessage";
System.out.println(SQL);
Query query=session.createQuery(SQL);
System.out.println(query.list().size());
return new LinkedList <ForumMessage>(query.list());
会话会话=gileadhbernateutil.getSessionFactory().openSession();
SQL=“from ForumMessage”;
System.out.println(SQL);
Query=session.createQuery(SQL);
System.out.println(query.list().size());
返回新的LinkedList(query.list());
您还需要添加lazy=“false” 您可以将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);
会话会话=gileadhbernateutil.getSessionFactory().openSession();
字符串sql=“from ForumMessage”;
Query=session.createQuery(sql);
列表结果=query.List()
for(ForumMessage消息:结果)
{
初始化(message.User);
}
返回新的LinkedList(结果);
如果你有必要,你应该只做其中一个。默认情况下,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);
}
}
public LinkedList getMessages()
{
//假定会话在其他位置打开和关闭。
字符串sql=“from ForumMessage”;
Query=session.createQuery(sql);
List results=query.List();
//对数据库的额外调用的开销发生在这里。
//如果惰性负载设置为false,这将产生类似的影响。
for(ForumMessage消息:结果)
{
初始化(message.User);
}
返回新的LinkedList(结果);
}
公共消息()
{
LinkedList messages=getMessages();
for(ForumMessage消息:消息)
{
System.out.println(message.ForumMessage);
}
}
在上面的代码示例中,加载所有用户对象会产生开销,但这些对象从未使用过。如果使用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);
}
}
}
public LinkedList getMessages()
{
//假定会话在其他位置打开和关闭。
字符串sql=“from ForumMessage”;
Query=session.createQuery(sql);
List results=query.List();
返回新的LinkedList(结果);
}
公共消息()
{
LinkedList messages=getMessages();
for(ForumMessage消息:消息)
{
//当用户被访问时,Hibernate将在这里加载用户对象。
用于(用户:message.user)
{
System.out.println(用户);
}
}
}
延迟加载时需要注意的一点是,所有加载都必须在活动会话中完成。如果您没有活动会话,并且尝试访问尚未加载的内容,Hibernate将抛出LazyInitializationException
此外,使用Hibernate的延迟加载功能更符合持久性忽略的思想,而使用Hibernate.initialize()则不符合这一点。您能显示相应的表定义吗?我相信这是Hibernate的延迟加载。。在尝试使用该对象之前,不会加载该对象。请尝试从“ForumMessage”链接列表访问用户对象。
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);
}
}
}