Hibernate List和Bag Mapping的区别

Hibernate List和Bag Mapping的区别

Hibernate同时支持列表和包映射和集合映射。因此,关于使用哪种数据类型最好,就需要进行权衡。选择将纯粹基于需求,但让我们看看它们之间的差异。当存在一对多关系或多对多关系时,我们必须使用List或Bag Mapping。

List Mapping

让我们在使用时看到配置文件 List Mapping

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping SYSTEM
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
   
<hibernate-mapping>
   
 <class name="<Sample POJO class>" table="<Sample table>">
  <id name="id" type="int" column="id">
    <generator class="native"></generator>
  </id>
    
   <!-- Other properties -->
  <list name="<some collection of fields like certifications, subjects etc., >" cascade="all">
      
     <key column="id"/>
          
     <!-- This is much required as this indicates as a
           pointer for insertion/deletion/updation-->
     <list-index column="idx"/>  
      
     <one-to-many class="<sample POJO class>"/>
      
  </list>
 </class>
   
</hibernate-mapping>

Bag Mapping

让我们看看配置文件 Bag Mapping.

<?xml version='1.0' encoding='UTF-8'?>  
<!DOCTYPE hibernate-mapping PUBLIC  
          "-//Hibernate/Hibernate Mapping DTD 5.3//EN"  
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    
<hibernate-mapping>  
    
 <class name="<Sample POJO class>" table="<Sample table>">  
   <id name="id">  
     <generator class="increment"></generator>  
   </id>  
     
   <!--  Other properties -->
   <!--  This is almost like a list but here we are using
          bag instead of a list. Main advantage is it does 
         not have a index element -->
   <bag name="<Some collections>" table="<Sample table>">  
     <key column="id"></key>  
     <element column="<a column>" type="string"></element>  
   </bag>  
              
 </class>  
              
</hibernate-mapping>

在生产部署需求或者对于直播产品来说,从性能的角度来说,我们需要去把包映射作为最好的选择。由于List映射需要排序,数据库操作会降低查询速度,并且需要花费大量时间来显示数据。另一方面,Bag映射是更好的选择,每当需要订购时,我们可能需要使用带有“order by”子句的JPQL查询。让我们看看Set在数据库操作和休眠方面的区别

Tag Order Duplicate
Set 这是无序的 不允许复制
List It is ordered 将允许重复
Bag 这是无序的 将允许重复

Difference Table

List Mapping Bag Mapping
java.util包包含List。 java.util包不包含Bag。
在Hibernate中,通过使用java.util.List,我们可以映射List。 在Hibernate中,通过使用java.util.List我们可以映射Bag。
列表是有序的,可能有副本。 包是无序的,允许重复。
这种方法会降低数据库操作的速度,因为以有序的方式检索关联会影响性能。 这是一种高效的方法,因为以无序的方式检索(一对多或一对多)之类的关联可以提供更好的性能。
默认情况下,我们得到有序的结果,但性能较慢。 为了实现订单,我们可能需要对订单使用JPQL查询,但只有在需要的时候我们才能这样做,因此它是一个额外的。
在较旧的Hibernate版本(5.0.8以前)中,在使用java.util.List并合并父实体时,Hibernate会为每个新子实体生成2条插入语句。 它不需要索引元素,并且几乎只与List类似。与List相比,Bag是首选。
对于多对多关联,处理List映射是一种糟糕的实践。Set Mapping是更好的选择。 几乎Bag和Set的行为方式是一样的,这取决于需求,可以决定是选择Set还是Bag
序列元素是必需的。 不需要序列元素。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程