2011-01-05 7 views
3

HibernateオブジェクトForumMessageをロードしようとしていますが、その中に別のオブジェクトがあります。UsersとUsersオブジェクトがロードされていません。Hibernateが関連するオブジェクトをロードしていません

マイ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> 

と私はfollwingのコードを使用しています:

あなたが "偽" =怠け者にも追加する必要があり
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()); 
+0

対応するテーブル定義を表示できますか? – jaydel

+0

これはHibernateの遅延読み込みと思われます。 オブジェクトは使用する前にロードされません "ForumMessage"リンクリストからユーザーオブジェクトにアクセスしてみてください。 – exiter2000

答えて

3
<many-to-one name="User" class="com.BiddingSystem.Models.Users" fetch="join" lazy="false"> 

+0

ありがとう、それは動作します! – Noor

+0

ha、2017年にあなたのアドバイスを受け取りました: – SoltanG

2

ForumMessageの読み込み時にユーザーを読み込む多対一マッピングにlazy="false"を追加できます。あるいは、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); 
     } 
    } 
} 

遅延ロードがすべてロードされている場合は、アクティブセッションで1つのポイントを実行する必要があります。アクティブなセッションがなく、まだロードされていないものにアクセスしようとすると、HibernateはLazyInitializationExceptionを投げます。

さらに、Hibernateの遅延ロード機能を使用すると、Hibernate.initialize()が使用しない永続性の無知の考え方にさらに従います。

+0

再び - 2017年にこのアドバイスを受けて、それは働いた:) – SoltanG

関連する問題