2013-02-05 2 views
0

Ceci est une structure de table:Mise en veille prolongée, comment sauter collection

<class name="test.Book" table="book" > 
    <cache usage="nonstrict-read-write"/> 
    <id column="id" name="id" type="int" unsaved-value="-1"> 
    <generator class ="increment"/> 
    </id> 
    <property column="title" name="title" type="string" not-null="false" /> 
    <property column="description" name="description" type="string" not-null="false" /> 
    <list name="chapters" table="bookChapters" cascade="persist"> 
    <cache usage="nonstrict-read-write"/> 
    <key column="bookChapter_id" /> 
    <list-index column="rank"/> 
    <many-to-many column="chapter_id" class="test.Chapter" /> 
    </list> 
</class> 

Chaque fois que je reçois le livre qu'il a collection de chapitres:

DetachedCriteria crit = DetachedCriteria.forClass(Book.class, id); 
List<Book> bookList = getHibernateTemplate().findByCriteria(crit); 

Parfois je besoin d'un livre sans collection de chapitres. Comment faire cela avec Hibernate?

Répondre

0

Un livre a des chapitres. Si elle n'a pas de chapitre, la collection sera vide. C'est ce que tu veux. Il itérer permet à travers les chapitres en faisant

for (Chapter chapter : book.getChapters()) { 
    ... 
} 

au lieu de

if (book.getChapters() != null) { 
    for (Chapter chapter : book.getChapters()) { 
     ... 
    } 
} 

Il permet de tester si le livre a des chapitres en faisant

if (!book.getChapters().isEmpty()) 

plutôt que en faisant

if (book.getChapters() != null && !book.getChapters.isEmpty()) 

null est le mal. Vous voulez éviter les collections nulles comme la peste, car elles causent des bogues et rendent le code moins lisible.

+0

Je n'ai pas besoin d'extraire des chapitres de la base de données, c'est-à-dire que peu importe le nombre de chapitres d'un livre dont je n'ai pas besoin. – Lazy

+0

Avec votre surnom, vous devriez avoir compris que: les collections sont chargées * paresseusement * par défaut. Donc, si vous n'accédez pas à la collection de chapitres, Hibernate ne chargera pas les chapitres de la base de données. Seulement si vous appelez une méthode sur la collection (size(), itérateur(), peu importe), Hibernate chargera les chapitres. –

+0

correct, mais j'ai un autre mode par défaut '' Donc, puis-je activer le mode paresseux à "vrai" dans certains cas? – Lazy

Questions connexes