- 浏览: 567596 次
文章分类
- 全部博客 (235)
- 数据库 (12)
- j2se (10)
- JQuery (2)
- 经验总结 (4)
- 防毒 (1)
- Struts (20)
- Spring (12)
- 项目 (3)
- 电脑维修项目 (1)
- Eclipse (2)
- JSP (13)
- mysql (5)
- Hibernate (54)
- ssh (1)
- 学习网站 (1)
- tomcat (9)
- servlet (24)
- java语言基础 (1)
- jbpm (1)
- linux (0)
- 技巧积累 (1)
- javaBean (2)
- 设计模式 (2)
- 实用的操作 (9)
- oracle (1)
- UML学习 (1)
- 版本控制 (1)
- 框架 (9)
- javaWeb基础 (13)
- c语言 (0)
- ant (0)
- 关于权限 (3)
- 真正开发有用 (5)
- javascript (2)
- 算法 (1)
- J2EE (1)
- junit (1)
最新评论
-
alleni123:
不错 一搜就搜到这个了
ssession和servletContext的比较 -
hua7381:
楼主,你真实帮了大忙了!!
万能乱码处理---url传中文 -
albrich:
1楼是正解
摘] 装了个Tomcat遇到的问题 -
JA_mcj:
ssession和servletContext的比较 -
haotw:
看了很有帮助,总算对hibernate的延迟加载有一定的了解了 ...
[转]hibernate延迟加载
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
);
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();
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();
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 (?, ?)
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
);
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的效率好了许多。
发表评论
-
多对多双项关联
2007-12-02 16:39 4076数据库中仍然是利用一个中间表 持久化类中,都各自包含对方的集合 ... -
多对多单项关联
2007-12-02 16:02 44881.多对多单项关联 在数据库中多对多的关系,表之间设置一个中间 ... -
一对一关联
2007-12-02 14:13 3627一对一的关联 分为外键关联和主键关联 外键关联:在关系模型的表 ... -
双向的多对一或者双向的一对多
2007-12-02 00:38 3563一对多或者多对一都是从一方来看, 双向是从两个方向来看 这个时 ... -
一对多的另一个问题
2007-12-02 00:19 3319如果email 的一方设置uid 不能为空的话回报错,所以需要 ... -
做一对多遇到的几个问题(单向)
2007-12-02 00:14 3265java 代码 public class Use ... -
多对一举例(单项的,从一个方向看)
2007-12-01 23:15 3631java 代码 public class Use ... -
hibernate多对一
2007-12-01 22:59 4254处理多对一的时候 感觉关系模型多对一和一对多是一样的 在域模型 ... -
[转]Hibernate中的outer-join(二):fetch
2007-12-01 22:49 4605... -
hibernate中集合排序
2007-12-01 18:49 3685set,map可以支持内存排序和数据库排序 List什么都不支 ... -
[转] hibernate中给集合排序的方法
2007-12-01 18:47 5759<iframe style="MARGIN ... -
[转]集合类型和结果集排序
2007-12-01 18:39 3489言归正传,Hibernate中的Collection类型分为有 ... -
[转]hibernate延迟加载
2007-12-01 18:22 5980hibernate 延迟加载问题探 ... -
[转]主键自动生成办法
2007-12-01 18:11 3414... -
hibernate值类型集合映射之Map
2007-12-01 17:02 2899java 代码 public class Use ... -
hibernate值类型集合映射之List
2007-12-01 16:43 3307java 代码 public class Use ... -
值类型映射---Set(2)
2007-12-01 13:43 3109这里自定义Email类,set里面放的是 email 类,非 ... -
值类型映射---Set(1)
2007-12-01 13:20 3398这里介绍2种不同的域模型的设计, 一种是Set里面装Strin ... -
事务的作用
2007-12-01 12:41 4557事务的作用是为了防止修改数据库, 如果只是查询那么就没必要修改 ... -
hibernate中用于分页的方法.
2007-12-01 00:14 3243java 代码 public void test ...
相关推荐
标题中的“hibernate bag 集合映射”指的是Hibernate框架中的一种关系映射机制。Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者将数据库表与Java类进行映射,使得在处理数据库操作时可以使用面向...
在Java的持久化框架Hibernate中,关系映射是数据库对象之间的关联方式,它允许我们将复杂的数据库结构映射到Java对象上。"Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联...
在 Hibernate 中,`hbm.xml` 文件是用于定义对象与数据库表之间映射的元数据文件。这篇文档将深入解析 `hbm.xml` 配置的各个方面。 ### 1. `hbm.xml` 文件结构 `hbm.xml` 文件的开头通常包含 XML 声明和 DTD 引用...
在Hibernate中,可以通过注解或XML配置来实现对象属性和集合的延迟加载。 【类间关系映射】 Hibernate 支持多种对象关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
本文档旨在提供一个全面的@hibernate Tag参考指南,帮助开发人员更好地理解和使用这些标签。 #### 一、@hibernate Tag for Class Level 在类级别上应用@hibernate Tag可以定义持久化类的属性和行为。 ##### 1.1 @...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
为了更好地解释集合映射的概念,我们首先定义两个实体类:`Customer`类与`Order`类。这两个类分别对应数据库中的`customer`表和`orders`表,并且存在一个典型的“一对多”关系。具体定义如下: 1. **Customer 类** ...
在Hibernate中配置二级缓存,需要在映射文件中使用元素,以及选择合适的缓存提供者,如EhCache、OSCache等。 6. 最佳实践:最佳实践是指在使用Hibernate时推荐的一些开发习惯和技术选择。例如,应该尽量使用双向...
此外,它们也常用于数据持久化操作,比如在Hibernate或MyBatis中,对查询结果进行转换和处理。 总的来说,Commons Collections和Apache BeanUtils是Java开发中不可或缺的工具库,它们大大提高了代码的可读性和可...
Bag和list是反向集合类中效率最高的 20.5.4. 一次性删除(One shot delete) 20.6. 监测性能(Monitoring performance) 20.6.1. 监测SessionFactory 20.6.2. 数据记录(Metrics) 21. 工具箱指南 21.1....
你必须作出一个选择,要么在组合元素中使用不能为空的属性,要么选择使用,,<bag> 或者 而不是 。 组合元素有个特别的用法是它可以包含一个<many-to-one>元素。类似这样的映射允许你将一个many-to-many关联表映射为...
在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便更好地管理和操作数据。这篇文章将深入探讨Hibernate中的集合映射机制,包括其基本概念、类型以及如何在实际开发中进行...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
14.2 映射Bag(包) 14.3 映射List(列表) 14.4 映射Map 14.5 对集合排序 14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
2. **配置映射文件**:在Hibernate的XML映射文件中,为这两个实体类定义对应的`<class>`标签,并使用`<bag>`或`<set>`标签来表示多的一方(如`Order`),使用`<one-to-many>`标签指定关联的单一方(如`User`)。...