Hibernate does not load related object

I am trying to load a Hibernate ForumMessage object, but there is another object in it. Users and the Users object are not loading.

My ForumMessage mapping file:

<?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>

and I use the following code:

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());
+3
source share
2 answers
<many-to-one name="User" class="com.BiddingSystem.Models.Users" fetch="join" lazy="false">

You need to add lazy = "false".

+3
source

You can add lazy="false"a many-to-one display that will load users upon loading ForumMessage. Alternatively, you can initialize the list of users using Hibernate.initialize (). Just make sure you do this before you close the session.

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);

, , . , . :

public LinkedList getMessages()
{
    //It 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 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() .

+2

Source: https://habr.com/ru/post/1783677/


All Articles