Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate未加载关联对象_Java_Hibernate_Orm - Fatal编程技术网

Java Hibernate未加载关联对象

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

我正在尝试加载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">
<!-- 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);
        }
    }
}