- 浏览: 176591 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 3846--按年分组查看 select to_char ... -
(转)aop:pointcut expression解析
2011-12-26 14:20 1176execution(* com.aptech.jb.epet. ... -
(转)SQL语句中,为什么where子句不能使用列别名,而order by却可以
2011-12-05 10:34 2109sqlserver查询的执行顺序是: (1)FROM < ... -
postgresql 导入和导出数据
2011-09-22 10:59 6244自oracle自收购sun以来,牵起了对java的种种纠纷, ... -
JSP页面跳转方法荟萃
2011-09-19 14:23 14451. response.sendRedirct("跳 ... -
如何同时启动多个Tomcat服务器(转)
2011-09-16 10:05 821前些时日,出于某种需要,需要同时启动多个Tomcat服务器,在 ... -
在浏览器查看svn中代码的解决方案(转)
2011-09-15 15:38 5226重新安装svn+apache以后,发现一个问题,比如java源 ... -
如何让svnserve.exe在WINDOWS中自动运行
2011-09-15 14:50 1156将svn设置成为系统服务自动运行就行了。 方法: 在Windo ... -
[原创]SS FrameWork For PHP 4.0 (专注于extjs和flex的PHP MVC核心框架)
2011-09-15 13:28 3557这是我以前写的PHP MVC 框架核心, 麻雀虽小五脏俱全,完 ... -
[原创]xampp-tomcat- connector---- xampp 完美整合现有的tomcat [续]
2011-09-15 13:18 5580在笔者拙作 xampp(apache+mod_jk)整合现有 ... -
Bat脚本中带ANT命令,会忽略ANT后面的命令?
2011-09-14 15:47 1932如题, bat中带有ant -debug 则后面的命令没有执行 ... -
xampp(apache+mod_jk)整合现有的tomcat
2011-09-14 12:15 52201. Xampp官网 http://www.apach ... -
svn + vim + ant + linux 竟然完全替代了eclipse
2011-09-14 09:18 3094很难想象, 一个公司只用 svn + vim + ant + ... -
Ant <Delete> 如何只删掉文件夹下所有文件和文件夹(转)
2011-09-13 18:20 3495用fileset 来过滤要删掉的目录和文件 <dele ... -
ANT的安装/配置笔记(转)
2011-09-13 14:38 727内容摘要: ant是一个基 ... -
windows 安装tomcat服务
2011-09-13 14:16 998D:\usr\tomcat\bin>service.ba ... -
struts 1 中 <html:form>
2011-09-13 12:03 11687来看看 使用 ActionForm 这个主题,当时使用了一个静 ... -
关于struts标签bean:message(转)
2011-09-13 11:55 1223bean:message标签用来从指 ... -
Servlet中的filter(转)
2011-09-13 11:21 992Filter:Filter 技术是servlet 2.3 新增 ... -
Filter的用处与种类
2011-09-13 11:19 1198Filter有如下几个用处。 •在HttpServletRe ...
相关推荐
hibernate包详解+hibernatePPThibernate包详解+hibernatePPThibernate包详解+hibernatePPT
hibernate注解详解
精通hibernate hibernate详解
NULL 博文链接:https://lijunabc.iteye.com/blog/443353
Hibernate详解,为你打开Hibernate使用的底层框架。
Hibernate技术详解 ,为初学者了解hql提供帮助
spring +hibernate 详解与配置(附图)
hibernate 缓存详解hibernate 缓存详解hibernate 缓存详解hibernate 缓存详解
以下章节源码[03] [04] [05] [08] [10] [11] [12] [13] [14] [15] [16]
Hibernate缓存深入详解
关于hibernate的文档,让你详细的了解hibernate
一。实体Bean 每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 @Entity 注解来进行声明。...Hibernate 可以对类的属性或者方法进行注解。属性对应field类别,方法的 getXxx()对应property类别。
整合struts+hibernate图文详解.doc 整合struts+hibernate图文详解.doc
hibernate的配置介绍,在myeclipse中配置hibernate,hibernate已经在myeclipse中了,创建工程,然后在工程中添加hibernate框架,一些设置
Hibernate 配置详解 (二)
Hibernate 配置详解 (一)
spring+hibernate整合详解(截图)
hibernate的详解 hibernate的原理 hibernate的api weblogic上的配置
Hibernate 缓存 深入 详解 ITEye