- 浏览: 179087 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Caelebs:
RMI及其调试(JDK1.6) -
walker2009:
...
svn如何使用import目录作为工作拷贝+我的svn学习笔记(转) -
ygsilence:
请问,怎么linux版本的xampp怎么整合现有tomcat, ...
[原创]xampp-tomcat- connector---- xampp 完美整合现有的tomcat [续] -
witcheryne:
zrong 写道skanion 写道VIMweejulius ...
svn + vim + ant + linux 竟然完全替代了eclipse -
zrong:
skanion 写道VIMweejulius 写道怎么重构用V ...
svn + vim + ant + linux 竟然完全替代了eclipse
简单的说,这些集合类除了bag (bag实际上对应着java.util.Collection接口),都有其对应的JDK中接口的语义。它们都可以表示一对多或多对多。
Set对应于java.util.Set接口,表示一个没有重复元素的集合。
怎样区别重复元素?这就涉及到对象的同一性。我们知道在数据库中,我们用主键来区分每一条记录,在Java的对象世界中,我们是用Object.equals()方法来区分是否是等价的对象。
set保证,在这个集合中,没有重复的对象。即,没有任何对象之间用equals比较返回true。如果我们正确地覆盖了entity类中的equals方法,我们就能保证在set映射中,set没有重复对象。
bag 没有对应语义的JDK接口,它对应的是java.util.Collection接口,它表示一个可以有重复元素的集合。
list对应JDK的 java.util.List接口,可以有重复元素。
array对应对象数组,Hibernate也不建议使用。
除了上面的集合类,还有一个map映射,对应java.util.Map,当然语义上说就是值名对。
这些集合类都可用,主要看你以什么角度,怎样的使用方式来使用。
区别就是上面所讲的。
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
);
ALTER TABLE item ADD CONSTRAINT fk_item_user FOREIGN KEY (id)REFERENCES user(id);
bag:
无主键,item id为外键关联到user id主键上.
接着定义映射文件,如下所示:
* User.hbm.xml
java 代码
1. <?xml version="1.0" encoding="utf-8"?>
2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
3. <hibernate-mapping>
4. <class name="onlyfun.caterpillar.User" table="user">
5. <id name="id" column="id" type="java.lang.Integer">
6. <generator class="native" />
7. </id>
8. <property name="name" column="name" type="java.lang.String" />
9. <bag name="items" table="item">
10. <key column="id" />
11. <element column="name" type="java.lang.String" />
12. </bag>
13. </class>
14. </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 primary key,
id INT(11) NOT NULL,
name VARCHAR(100) NOT NULL
);
ALTER TABLE item ADD CONSTRAINT fk_item_user FOREIGN KEY (id)REFERENCES user(id);
Idbag:
cid 为主键
item id为外键关联到user id主键上.
其中item表格的cid就用于资料更新时定位之用,接着在映射文件中使用<idbag>标签加以定义:
* User.hbm.xml
xml 代码
1. <?xml version="1.0" encoding="utf-8"?>
2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
3. <hibernate-mapping>
4. <class name="onlyfun.caterpillar.User" table="user">
5. <id name="id" column="id" type="java.lang.Integer">
6. <generator class="native" />
7. </id>
8. <property name="name" column="name" type="java.lang.String" />
9. <idbag name="items" table="item">
10. <collection-id column="cid" type="java.lang.String">
11. <generator class="uuid.hex" />
12. </collection-id>
13. <key column="id" />
14. <element column="name" type="java.lang.String" />
15. </idbag>
16. </class>
17. </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的效率好了许多。
Set对应于java.util.Set接口,表示一个没有重复元素的集合。
怎样区别重复元素?这就涉及到对象的同一性。我们知道在数据库中,我们用主键来区分每一条记录,在Java的对象世界中,我们是用Object.equals()方法来区分是否是等价的对象。
set保证,在这个集合中,没有重复的对象。即,没有任何对象之间用equals比较返回true。如果我们正确地覆盖了entity类中的equals方法,我们就能保证在set映射中,set没有重复对象。
bag 没有对应语义的JDK接口,它对应的是java.util.Collection接口,它表示一个可以有重复元素的集合。
list对应JDK的 java.util.List接口,可以有重复元素。
array对应对象数组,Hibernate也不建议使用。
除了上面的集合类,还有一个map映射,对应java.util.Map,当然语义上说就是值名对。
这些集合类都可用,主要看你以什么角度,怎样的使用方式来使用。
区别就是上面所讲的。
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
);
ALTER TABLE item ADD CONSTRAINT fk_item_user FOREIGN KEY (id)REFERENCES user(id);
bag:
无主键,item id为外键关联到user id主键上.
接着定义映射文件,如下所示:
* User.hbm.xml
java 代码
1. <?xml version="1.0" encoding="utf-8"?>
2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
3. <hibernate-mapping>
4. <class name="onlyfun.caterpillar.User" table="user">
5. <id name="id" column="id" type="java.lang.Integer">
6. <generator class="native" />
7. </id>
8. <property name="name" column="name" type="java.lang.String" />
9. <bag name="items" table="item">
10. <key column="id" />
11. <element column="name" type="java.lang.String" />
12. </bag>
13. </class>
14. </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 primary key,
id INT(11) NOT NULL,
name VARCHAR(100) NOT NULL
);
ALTER TABLE item ADD CONSTRAINT fk_item_user FOREIGN KEY (id)REFERENCES user(id);
Idbag:
cid 为主键
item id为外键关联到user id主键上.
其中item表格的cid就用于资料更新时定位之用,接着在映射文件中使用<idbag>标签加以定义:
* User.hbm.xml
xml 代码
1. <?xml version="1.0" encoding="utf-8"?>
2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
3. <hibernate-mapping>
4. <class name="onlyfun.caterpillar.User" table="user">
5. <id name="id" column="id" type="java.lang.Integer">
6. <generator class="native" />
7. </id>
8. <property name="name" column="name" type="java.lang.String" />
9. <idbag name="items" table="item">
10. <collection-id column="cid" type="java.lang.String">
11. <generator class="uuid.hex" />
12. </collection-id>
13. <key column="id" />
14. <element column="name" type="java.lang.String" />
15. </idbag>
16. </class>
17. </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的效率好了许多。
发表评论
-
(转)postgreSQL 实现按月按年,按日统计 分组统计
2011-12-26 18:11 3900--按年分组查看 select to_char ... -
(转)aop:pointcut expression解析
2011-12-26 14:20 1222execution(* com.aptech.jb.epet. ... -
(转)SQL语句中,为什么where子句不能使用列别名,而order by却可以
2011-12-05 10:34 2161sqlserver查询的执行顺序是: (1)FROM < ... -
postgresql 导入和导出数据
2011-09-22 10:59 6277自oracle自收购sun以来,牵起了对java的种种纠纷, ... -
JSP页面跳转方法荟萃
2011-09-19 14:23 14861. response.sendRedirct("跳 ... -
如何同时启动多个Tomcat服务器(转)
2011-09-16 10:05 849前些时日,出于某种需要,需要同时启动多个Tomcat服务器,在 ... -
在浏览器查看svn中代码的解决方案(转)
2011-09-15 15:38 5245重新安装svn+apache以后,发现一个问题,比如java源 ... -
如何让svnserve.exe在WINDOWS中自动运行
2011-09-15 14:50 1187将svn设置成为系统服务自动运行就行了。 方法: 在Windo ... -
[原创]SS FrameWork For PHP 4.0 (专注于extjs和flex的PHP MVC核心框架)
2011-09-15 13:28 3591这是我以前写的PHP MVC 框架核心, 麻雀虽小五脏俱全,完 ... -
[原创]xampp-tomcat- connector---- xampp 完美整合现有的tomcat [续]
2011-09-15 13:18 5654在笔者拙作 xampp(apache+mod_jk)整合现有 ... -
Bat脚本中带ANT命令,会忽略ANT后面的命令?
2011-09-14 15:47 1955如题, bat中带有ant -debug 则后面的命令没有执行 ... -
xampp(apache+mod_jk)整合现有的tomcat
2011-09-14 12:15 52511. Xampp官网 http://www.apach ... -
svn + vim + ant + linux 竟然完全替代了eclipse
2011-09-14 09:18 3140很难想象, 一个公司只用 svn + vim + ant + ... -
Ant <Delete> 如何只删掉文件夹下所有文件和文件夹(转)
2011-09-13 18:20 3522用fileset 来过滤要删掉的目录和文件 <dele ... -
ANT的安装/配置笔记(转)
2011-09-13 14:38 752内容摘要: ant是一个基 ... -
windows 安装tomcat服务
2011-09-13 14:16 1020D:\usr\tomcat\bin>service.ba ... -
struts 1 中 <html:form>
2011-09-13 12:03 11732来看看 使用 ActionForm 这个主题,当时使用了一个静 ... -
关于struts标签bean:message(转)
2011-09-13 11:55 1250bean:message标签用来从指 ... -
Servlet中的filter(转)
2011-09-13 11:21 1028Filter:Filter 技术是servlet 2.3 新增 ... -
Filter的用处与种类
2011-09-13 11:19 1234Filter有如下几个用处。 •在HttpServletRe ...
相关推荐
### Hibernate配置详解(一):理解配置文件的重要性与细节 #### 概述 在Java持久化框架中,Hibernate因其灵活性和强大的ORM(对象关系映射)能力而备受开发者青睐。然而,要想充分发挥Hibernate的潜力,深入理解...
2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3. Hibernate配置 2.2.4. 用Ant编译 2.2.5. 安装和帮助 2.2.6. 加载并存储对象 2.3. 第二...
Hibernate 集合映射详解 Hibernate 是一个流行的Java持久化框架,它提供了多种集合映射类型,以满足不同的业务需求。在 Hibernate 中,集合映射是指将 Java 集合类型与数据库表之间的映射关系。常见的集合映射类型...
14.2 映射Bag(包) 14.3 映射List(列表) 14.4 映射Map 14.5 对集合排序 14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射...
【Hibernate配置文件中映射元素详解】 在对象关系映射(ORM)框架Hibernate中,对象与数据库表之间的关联是通过一个XML配置文件来定义的。这个XML文件包含了映射元素,用于描述Java类如何转化为数据库中的表。映射...
在Hibernate中,我们使用`<set>`或`<bag>`标签来表示这种关系,同时需要定义一个关联的实体类。例如,考虑User和Role的关系: ```xml <many-to-many column="role_id" class="com.bjsxt.hibernate.Role"/> ``` ...
例如,一对多关系可以通过 `<set>` 或 `<bag>` 标签实现,多对一关系则使用 `<one-to-one>` 标签。 此外,还可以自定义主键生成策略,通过扩展 Hibernate 类来实现特定需求。 ### 5. 参考资料 对于更详细的配置...
在Java的Hibernate框架中,List和Bag都是用来映射数据库中一对多关系的集合类型。它们都是基于集合接口实现的,允许存储多个关联的对象。然而,尽管它们在使用上相似,但有一些关键的区别。 首先,List是Java.util....
### Hibernate性能优化方案详解 #### 一、引言 Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,其高效性和灵活性受到众多开发者的青睐。然而,不当的设计和配置往往会导致性能瓶颈,严重影响应用程序...
《Hibernate集合映射详解》 Hibernate作为Java领域中的一款强大持久化框架,其核心功能之一就是对象关系映射(ORM),使得开发者可以方便地在Java对象与数据库表之间进行交互。其中,集合映射是Hibernate中非常关键...
14.2 映射Bag(包) 14.3 映射List(列表) 14.4 映射Map 14.5 对集合排序 14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射...
14.2 映射Bag(包) 14.3 映射List(列表) 14.4 映射Map 14.5 对集合排序 14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射...
第一部分 从Hibernate和EJB 3.0开始 第1章 理解对象/关系持久化 1.1 什么是持久化 1.1.1 关系数据库 1.1.2 理解SQL 1.1.3 在Java中使用SQL 1.1.4 面向对象应用程序中的持久化 1.2 范式不...
14.2 映射Bag(包) 14.3 映射List(列表) 14.4 映射Map 14.5 对集合排序 14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射...
**Hibernate 框架详解** Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。通过使用Hibernate,开发者可以将业务对象与数据库表进行映射,从而避免了传统的JDBC操作...
### Hibernate参考手册知识点详解 #### 一、简介与目标 **Hibernate** 是一款开源的对象关系映射(ORM)框架,其主要目标是减轻开发者在数据持久化编程中的工作量,帮助开发者实现对象模型与数据库之间的无缝对接...
**Hibernate映射详解** 在Java世界中,关系型数据库与对象模型之间的转换一直是开发中的一个挑战。Hibernate,作为一款强大的对象关系映射(ORM)框架,有效地解决了这个问题。本篇文章将深入探讨Hibernate映射的...
- Hibernate 的配置文件(hibernate.cfg.xml)详解,包括数据库连接、事务管理、缓存策略等设置。 - SessionFactory 的创建和作用,以及如何在应用程序中初始化和关闭。 2. **实体映射** - 使用注解或XML方式对...