📄 collections.html
字号:
<map name="holidays" sort="my.custom.HolidayComparator"> <key column="year_id"/> <map-key column="hol_name" type="string"/> <element column="hol_date" type="date"/></map></pre><p> <tt class="literal">sort</tt>属性中允许的值包括<tt class="literal">unsorted</tt>,<tt class="literal">natural</tt>和某个实现了<tt class="literal">java.util.Comparator</tt>的类的名称。 </p><p> 分类集合的行为事实上象<tt class="literal">java.util.TreeSet</tt>或者<tt class="literal">java.util.TreeMap</tt>。 </p><p> 如果你希望数据库自己对集合元素排序,可以利用<tt class="literal">set</tt>,<tt class="literal">bag</tt>或者<tt class="literal">map</tt>映射中的<tt class="literal">order-by</tt>属性。这个解决方案只能在jdk1.4或者更高的jdk版本中才可以实现(通过LinkedHashSet或者LinkedHashMap实现)。 它是在SQL查询中完成排序,而不是在内存中。 </p><pre class="programlisting"><set name="aliases" table="person_aliases" order-by="lower(name) asc"> <key column="person"/> <element column="name" type="string"/></set><map name="holidays" order-by="hol_date, hol_name"> <key column="year_id"/> <map-key column="hol_name" type="string"/> <element column="hol_date" type="date"/></map></pre><p> 注意: 这个<tt class="literal">order-by</tt>属性的值是一个SQL排序子句而不是HQL的! </p><p> 关联还可以在运行时使用集合<tt class="literal">filter()</tt>根据任意的条件来排序。 </p><pre class="programlisting">sortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();</pre></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-bidirectional"></a>6.3.2. 双向关联(Bidirectional associations)</h3></div></div><div></div></div><p> <span class="emphasis"><em>双向关联</em></span>允许通过关联的任一端访问另外一端。在Hibernate中, 支持两种类型的双向关联: </p><div class="variablelist"><dl><dt><span class="term">一对多(one-to-many)</span></dt><dd><p> Set或者bag值在一端, 单独值(非集合)在另外一端 </p></dd><dt><span class="term">多对多(many-to-many)</span></dt><dd><p> 两端都是set或bag值 </p></dd></dl></div><p> </p><p> 要建立一个双向的多对多关联,只需要映射两个many-to-many关联到同一个数据库表中,并再定义其中的一端为<span class="emphasis"><em>inverse</em></span>(使用哪一端要根据你的选择,但它不能是一个索引集合)。 </p><p> 这里有一个many-to-many的双向关联的例子;每一个category都可以有很多items,每一个items可以属于很多categories: </p><pre class="programlisting"><class name="Category"> <id name="id" column="CATEGORY_ID"/> ... <bag name="items" table="CATEGORY_ITEM"> <key column="CATEGORY_ID"/> <many-to-many class="Item" column="ITEM_ID"/> </bag></class><class name="Item"> <id name="id" column="CATEGORY_ID"/> ... <!-- inverse end --> <bag name="categories" table="CATEGORY_ITEM" inverse="true"> <key column="ITEM_ID"/> <many-to-many class="Category" column="CATEGORY_ID"/> </bag></class></pre><p> 如果只对关联的反向端进行了改变,这个改变<span class="emphasis"><em>不会</em></span>被持久化。 这表示Hibernate为每个双向关联在内存中存在两次表现,一个从A连接到B,另一个从B连接到A。如果你回想一下Java对象模型,我们是如何在Java中创建多对多关系的,这可以让你更容易理解: </p><pre class="programlisting">category.getItems().add(item); // The category now "knows" about the relationshipitem.getCategories().add(category); // The item now "knows" about the relationshipsession.persist(item); // The relationship won''t be saved!session.persist(category); // The relationship will be saved</pre><p> 非反向端用于把内存中的表示保存到数据库中。 </p><p> 要建立一个一对多的双向关联,你可以通过把一个一对多关联,作为一个多对一关联映射到到同一张表的字段上,并且在"多"的那一端定义<tt class="literal">inverse="true"</tt>。 </p><pre class="programlisting"><class name="Parent"> <id name="id" column="parent_id"/> .... <set name="children" inverse="true"> <key column="parent_id"/> <one-to-many class="Child"/> </set></class><class name="Child"> <id name="id" column="child_id"/> .... <many-to-one name="parent" class="Parent" column="parent_id" not-null="true"/></class></pre><p> 在“一”这一端定义<tt class="literal">inverse="true"</tt>不会影响级联操作,二者是正交的概念! </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-indexedbidirectional"></a>6.3.3. 双向关联,涉及有序集合类</h3></div></div><div></div></div><p> 对于有一端是<tt class="literal"><list></tt>或者<tt class="literal"><map></tt>的双向关联,需要加以特别考虑。假若子类中的一个属性映射到索引字段,没问题,我们仍然可以在集合类映射上使用<tt class="literal">inverse="true"</tt>: </p><pre class="programlisting"><class name="Parent"> <id name="id" column="parent_id"/> .... <map name="children" inverse="true"> <key column="parent_id"/> <map-key column="name" type="string"/> <one-to-many class="Child"/>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -