`
aa8945163
  • 浏览: 275224 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate 中的bag

 
阅读更多
Bag是集合,与Set不同的是,Bag允许重复的元素,
在Java的标准API中并没有提供Bag容器,Hibernate提供自己的Bag实现,允许您将List映射为Bag。
您可以如下定义User类别,其中的List成员将被用作Bag来使用,而不管物件在List容器中的顺序:

User.java
package onlyfun.caterpillar;
import java.util.List;
public class User {  
private Integer id;  
private String name;  
private List items;  
// 必须要有一个预设的建构方法  
// 以使得Hibernate可以使用Constructor.newInstance()建立物件  
public User() {}  
public Integer getId() {        return id;    }  
public void setId(Integer id) {        this.id = id;    }  
public String getName() {        return name;    }  
public void setName(String name) {        this.name = name;    }  
public List getItems() {        return items;    }  
public void setItems(List items) {        this.items = items;    }  
public void addItem(String item) {        items.add(item);    }   
public void removeItem(String name) {        items.remove(name);    }
}
最简单的Bag映射是使用<bag>标签,在这之前,假设您如下建立表格:
CREATE TABLE user (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    name VARCHAR(100) NOT NULL default ''
);
CREATE TABLE item (
    id INT(11) NOT NULL,
    name VARCHAR(100) NOT NULL
);

接着定义映射文件,如下所示:
User.hbm.xml
java 代码
<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping  PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping>  
    <class name="onlyfun.caterpillar.User" table="user">  
        <id name="id" column="id" type="java.lang.Integer">  
            <generator class="native" />  
        </id>  
        <property name="name" column="name" type="java.lang.String" />  
        <bag name="items" table="item">  
            <key column="id" />  
            <element column="name" type="java.lang.String" />  
        </bag>  
    </class>  
</hibernate-mapping> 
假设您如下储存物件:
User user1 = new User();
user1.setItems(new ArrayList());
user1.setName("caterpillar");
user1.addItem("Java Gossip");
user1.addItem("Java Gossip");
user1.addItem("Caxxx A80");
      
User user2 = new User();
user2.setItems(new ArrayList());
user2.setName("momor");
user2.addItem("Snoppy world");      
      
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user1);
session.save(user2);
tx.commit();
session.close();

则资料库中会有如下的资料:
mysql> select * from user;
+----+-------------+
| id    | name        |
+----+-------------+
|  1    | caterpillar |
|  2    | momor       |
+----+-------------+
2 rows in set (0.00 sec)
mysql> select * from item;
+----+--------------------+
| id    | name                 |
+----+-------------------+
|  1    | Java Gossip     |
|  1    | Java Gossip     |
|  1    | Caxxx A80        |
|  2    | Snoppy world |
+----+-------------------+
4 rows in set (0.00 sec)

您可以如下更新资料:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.load(User.class, new Integer(1));
user.removeItem("Java Gossip");
tx.commit();
session.close();

然而注意观察在更新资料时所使用的SQL:
Hibernate: delete from item where id=?
Hibernate: insert into item (id, name) values (?, ?)
Hibernate: insert into item (id, name) values (?, ?)

由于Bag的资料允许重复,当必须更新资料时,无法确定要更新的是哪一笔资料,因而采取的方式是删除集合物件对应的所有资料,然后重新将集合物件中的资料写入资料库,显然的这种作法相当的没有效率。
作为Bag的一种扩充,Hibernate提供idbag,藉由在定义Bag映射时加上"collection-id",让Hibernate可以直接确定所要更新的资料,提高资料库操作的效率,您可以先如下建立表格:
CREATE TABLE user (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    name VARCHAR(100) NOT NULL default ''
);
CREATE TABLE item (
    cid CHAR(32) NOT NULL,
    id INT(11) NOT NULL,
    name VARCHAR(100) NOT NULL
);

其中item表格的cid就用于资料更新时定位之用,接着在映射文件中使用<idbag>标签加以定义:
User.hbm.xml
xml 代码
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping  PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>    
<class name="onlyfun.caterpillar.User" table="user">        
<id name="id" column="id" type="java.lang.Integer">            
<generator class="native" />        
</id>        
<property name="name" column="name" type="java.lang.String" />        
<idbag name="items" table="item">            
<collection-id column="cid" type="java.lang.String">                
<generator class="uuid.hex" />            
</collection-id>            
<key column="id" />            
<element column="name" type="java.lang.String" />        
</idbag>    
</class>
</hibernate-mapping>

使用上面用过的程式片段来储存物件的话,资料库中会有如下的资料:
mysql> select * from user;
+----+-------------+
| id    | name        |
+----+-------------+
|  1    | caterpillar |
|  2    | momor      |
+----+-------------+
2 rows in set (0.00 sec)
mysql> select * from item;
+------------------------------------------------+----+--------------------+
| cid                                                            | id   | name                  |
+------------------------------------------------+----+--------------------+
| 297eba61056726030105672605df0001 |  1   | Java Gossip      |
| 297eba61056726030105672605df0002 |  1   | Java Gossip      |
| 297eba61056726030105672605df0003 |  1   | Caxxx A80         |
| 297eba61056726030105672605df0004 |  2   | Snoppy world  |
+------------------------------------------------+----+-------------------+
4 rows in set (0.00 sec)

如果使用上面提到过的程式片段来更新物件的话,则实际上Hibernate会使用以下的SQL来进行更新:
Hibernate: delete from item where cid=?

这一次并不是整个删除集合中的资料,而是直接藉由cid来确定所要更新的资料,比起只使用Bag,idbag的效率好了许多。
分享到:
评论

相关推荐

    hibernate bag 集合映射

    标题中的“hibernate bag 集合映射”指的是Hibernate框架中的一种关系映射机制。Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者将数据库表与Java类进行映射,使得在处理数据库操作时可以使用面向...

    Hibernate中文API大全

    你必须作出一个选择,要么在组合元素中使用不能为空的属性,要么选择使用,,&lt;bag&gt; 或者 而不是 。 组合元素有个特别的用法是它可以包含一个元素。类似这样的映射允许你将一个many-to-many关联表映射为组合元素的...

    Hibernate+中文文档

    Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...

    Hibernate常见集合映射(Set,List_Array,Map,Bag)

    在 Hibernate 中,集合映射是指将 Java 集合类型与数据库表之间的映射关系。常见的集合映射类型有 Set、List、Array、Map 和 Bag 等,每种类型都有其特点和应用场景。 Set 集合映射 Set 集合是 Hibernate 中基础的...

    hibernate3.2中文文档(chm格式)

    Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...

    Hibernate中文详细学习文档

    Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...

    在 Hibernate 中实现复杂的数据映射

    这种关系在映射配置中通常通过 `&lt;set&gt;` 或 `&lt;bag&gt;` 标签来定义。 3. **多对多关系**:Student 类与 Course 类之间是多对多的关系,通过 Student_Course_Link 中间表实现。在 Student 类中,有一个类型为 Set 的 ...

    hibernate中文帮助pdf

    《Hibernate中文帮助PDF》是Java开发领域中一份重要的参考资料,主要涵盖了Hibernate框架的全面知识,旨在帮助开发者理解和应用这一强大的对象关系映射(ORM)工具。Hibernate作为一个开源的ORM框架,极大地简化了...

    Hibernate 中文 html 帮助文档

    Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...

    hibernate中的集合映射范例程序

    在这个“hibernate中的集合映射范例程序”中,我们将深入探讨如何在Hibernate中进行集合映射,以及不同集合类型的应用场景。 首先,集合映射是Hibernate中处理一对多、多对多关系的核心机制。它允许我们将一个实体...

    hibernate中文帮助文档

    Hibernate是一款开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中使用对象模型,而无需直接操作SQL语句。这篇中文帮助文档将详细解释Hibernate的核心概念、配置、API使用以及最佳实践,旨在帮助...

    Hibernate_test

    `hb_02_bag`、`hb_02_list`、`hb_02_set`、`hb_02_sortedcollection`、`hb_02_orderedcollection`、`hb_02_map`这些文件名暗示了Hibernate中集合类型的映射。Hibernate支持多种集合类型,如ArrayList(对应Bag)、...

    详解Java的Hibernate框架中的List映射表与Bag映射

    在Java的Hibernate框架中,List和Bag都是用来映射数据库中一对多关系的集合类型。它们都是基于集合接口实现的,允许存储多个关联的对象。然而,尽管它们在使用上相似,但有一些关键的区别。 首先,List是Java.util....

    hibernate源码分析过程

    Hibernate 支持 JMX(Java Management Extensions)和 JCA(J2EE Connector Architecture),可以将 Hibernate 集成到 Java EE 应用服务器中。 配置 Hibernate 的配置可以通过多种方式实现,包括配置文件、可编程...

    Hibernate中文手册3.2最新版本

    这通常包括添加Hibernate库到项目的类路径中、创建配置文件(如`hibernate.cfg.xml`)以及定义映射文件等。 - **添加依赖**:确保项目中包含了Hibernate核心库和其他相关依赖库。 - **配置文件**:配置文件是启动...

    HibernateAPI中文版.chm

    Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...

    Hibernate实战(第2版 中文高清版)

     10.1.2 Hibernate应用程序中的事务   10.1.3 使用Java Persistence的事务   10.2 控制并发访问   10.2.1 理解数据库级并发   10.2.2 乐观并发控制   10.2.3 获得额外的隔离性保证   10.3 非事务数据...

    Hibernate3.3 中文参考

    在Hibernate 3.3版本中,这个框架继续优化了性能和增加了新特性,为开发者带来了更强大的功能和更高的开发效率。 本文将深入探讨Hibernate 3.3的核心概念、主要功能和使用方法。我们将从以下几个方面进行详细介绍:...

    Hibernate教程20_关系映射案例三

    9. **集合映射**:在一对多关系中,Hibernate通常使用集合(List, Set, Bag等)来表示多个关联对象。集合类型的选择会影响到数据的唯一性和排序。 10. **外键约束**:在数据库中,关系映射往往涉及到外键约束,...

    hibernate 帮助文档

    12. **集合映射**:包括List、Set、Map等类型的集合,Hibernate提供了不同的策略进行映射,如Bag、List、Set、Map等。 在SSH框架中,Hibernate主要负责数据层的处理,与Struts(视图层)和Spring(控制层和业务层)...

Global site tag (gtag.js) - Google Analytics