2016-05-02 18 views
0

私は、Hibernateで遅くコレクションをロードしようとしています。私はこのユニットテストを実行するとHibernate Lazy Loadingが多対1のXMLを使用しない

Session session = HibernateUtil.getSessionFactory().openSession(); 
session.beginTransaction(); 
Hibernate.initialize(this.truckReviews); 
session.getTransaction().commit(); 
session.close(); 
return this.truckReview; 

しかし、アサーションが失敗した:

Truck realTruck = Truck.getTruckByID(1); 
TruckReview realFakeReview = new TruckReview(); 
realFakeReview.setTruck(realTruck); 
realFakeReview.setUser(IntegrationTestResources.getTestUser()); 
realFakeReview.setReviewDate(new Date()); 
realFakeReview.setReviewStars(5); 
realFakeReview.setReviewText("fake review"); 
realFakeReview.save(); 
assertTrue(realTruck.loadReviews().contains(realFakeReview)); 
realFakeReview.delete(); 

言うまでもないが、私は、言うことは、私が何を読んでから、これはこれを行うためのベストプラクティスの方法ですこれは他のStackOverflowスレッドがこれを正しく行う方法だと言っているので少し混乱します。私は非常に明白な何かを見逃している必要がありますように感じるが、私はまだ休止状態に新しいと何が分からない。事前に

<hibernate-mapping> 
<class name="edu.temple.tutrucks.Truck" table="truck" catalog="TUTrucks" optimistic-lock="version"> 
    <id name="id" type="int"> 
     <column name="id" /> 
     <generator class="identity" /> 
    </id> 
    <property name="truckName" type="string"> 
     <column name="truck_name" not-null="true" /> 
    </property> 
    <property name="latitude" type="double"> 
     <column name="latitude" precision="22" scale="0" not-null="true" /> 
    </property> 
    <property name="longitude" type="double"> 
     <column name="longitude" precision="22" scale="0" not-null="true" /> 
    </property> 
    <property name="openingTime" type="imm_time"> 
     <column name="opening_time" not-null="false"></column> 
    </property> 
    <property name="closingTime" type="imm_time"> 
     <column name="closing_time" not-null="false"></column> 
    </property> 
    <property name="avatar" type="string"> 
     <column name="avatar"></column> 
    </property> 
    <list name="truckReviews" table="truck_review" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="truck_id" /> 
     </key> 
     <list-index column="review_stars" /> 
     <one-to-many class="edu.temple.tutrucks.TruckReview" /> 
    </list> 
    <list name="menus" table="menu" inverse="true" lazy="false" fetch="select"> 
     <key> 
      <column name="truck_id" /> 
     </key> 
     <list-index column="id" /> 
     <one-to-many class="edu.temple.tutrucks.Menu" /> 
    </list> 
    <set name="tags" table="tag_truck_map" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="truck_id" /> 
     </key> 
     <many-to-many column="tag_id" class="edu.temple.tutrucks.Tag"></many-to-many> 
    </set> 
</class> 
</hibernate-mapping> 

ありがとう:

はここで、このクラスのためのマッピングファイルです。

UPDATE:まだ問題を抱えて、私はこの

@Override 
public Truck loadReviews() { // lazy loading needs to be fixed 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    session.beginTransaction(); 
    Truck retval = (Truck) session.get(Truck.class, this.getId()); 
    Hibernate.initialize(retail.getTruckReviews()); 
    session.getTransaction().commit(); 
    session.close(); 
    retval.truckReviews.size(); 
    return retval; 
} 

にloadReviews方法を変更した、テストが今、この

@Test 
public void testloadReviews() { 
    Truck realTruck = Truck.getTruckByID(1, false, false); 
    TruckReview realFakeReview = new TruckReview(); 
    realFakeReview.setTruck(realTruck); 
    realFakeReview.setUser(IntegrationTestResources.getTestUser()); 
    realFakeReview.setReviewDate(new Date()); 
    realFakeReview.setReviewStars(5); 
    realFakeReview.setReviewText("fake review"); 
    realFakeReview.save(); 
    assertTrue(realTruck.loadReviews().getTruckReviews().contains(realFakeReview)); 
    realFakeReview.delete(); 
} 

答えて

0

のように見える問題は、あなたが使用することができないということですrealTruckフォーム他のセッションを使用してHibernate.initialize(this.truckReviews)を行うための一つのセッション

Session session = HibernateUtil.getSessionFactory().openSession(); 
session.beginTransaction(); 
// you need to reload persistent with 
// realTruck = session.get(), realTruck = session.load() here 
Hibernate.initialize(this.getTruckReviews()); 

Hibernateにプロキシが必要なため、プロパティではなくゲッターを使用する必要があります。プロキシはゲッターで返されます。

Hibernate.initialize(this.getTruckReviews()); 
+0

あなたのアドバイスを反映するためにいくつかの変更を加えましたが、私はまだ同じ問題を抱えています。何か案は? –

+0

@ NickDell'osa私は –

+0

にまだ問題がありますが、プロパティの代わりにゲッターを使用して別のアップデートを行いましたが、まだ動作していません。 –

関連する問題