2016-05-02 1 views
0

Я пытаюсь лениво загрузить коллекцию в Hibernate. Из того, что я прочитал это лучшая практика способ сделать это:Hibernate lazy loading не работает много-к-одному 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 и понятия не имею, что.

Вот файл отображения для этого класса:

<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: По-прежнему возникают проблемы, я изменил метод loadReviews к этому

@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; 
} 

И тест теперь выглядит следующим образом

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

Вам нужно использовать getter не свойство, потому что Hibernate должен иметь прокси. Прокси возвращается получателем

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

Я внес некоторые изменения, чтобы отразить ваш совет, но у меня все еще есть те же проблемы. Есть идеи? –

+0

@ NickDell'osa Я обновляю –

+0

, все еще имея проблемы, сделал еще одно обновление, используя геттеры вместо свойств, но он все еще не работает. –

 Смежные вопросы

  • Нет связанных вопросов^_^