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 |
序列元素是必需的。 | 不需要序列元素。 |