- 浏览: 281644 次
最新评论
-
liupengjun1:
学习看看!!!
Dom4j的使用(全而好的文章) -
李君寻:
条理清晰,有示例有分析,好文档,谢谢分享
Dom4j的使用(全而好的文章) -
TaoistWar:
nintenyun 写道TaoistWar 写道垃圾,不如看D ...
Dom4j的使用(全而好的文章) -
shangs2010:
写的真仔细,多谢!真好!
Dom4j的使用(全而好的文章) -
a346063587:
顶。。真的很好哈。。。。
Dom4j的使用(全而好的文章)
关于Hibernate的unsaved-value
unsaved-value是表示一个对象是新的还是旧的,当显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如:
在上例中,程序并没有显式的session.save(child); 那么Hibernate需要知道child究竟是一个临时对象,还是已经在数据库中有的持久对象。如果child是一个新创建的临时对象(本例中就是这种情况),那么Hibernate应该自动产生session.save(child)这样的操作,如果child是已经在数据库中有的持久对象,那么Hibernate应该自动产生session.update(child)这样的操作。3^)N%Q(}z1U Q$x
因此我们需要暗示一下Hibernate,究竟child对象应该对它自动save还是update。在上例中,显然我们应该暗示Hibernate对child自动save,而不是自动update。那么Hibernate如何判断究竟对child是save还是update呢?它会取一下child的主键属性 child.getId() ,这里假设id是 java.lang.Integer类型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate认为child是新的内存临时对象,发送save,如果不相等,那么Hibernate认为child是已经持久过的对象,发送update。`_/Zw
mV-yWr
unsaved-value="null" (默认情况,适用于大多数对象类型主键 Integer/Long/String/...)
bj%l
T^T
c/d [社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯当Hibernate取一下child的Id,取出来的是null(在上例中肯定取出来的是null),和unsaved-value设定值相等,发送save(child)
[YF5Wq*L%P LxC当Hibernate取一下child的id,取出来的不是null,那么和unsaved-value设定值不相等,发送update(child)
(U`cCowww.yoy1.com例如下面的情况:
child已经在数据库中有了,是一个持久化的对象,不是新创建的,因此我们希望Hibernate发送update(child),在该例中,Hibernate取一下child.getId(),和unsave-value指定的null比对一下,发现不相等,那么发送update(child)。
9V3LiPW+i社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯BTW: parent对象不需要操心,因为程序显式的对parent有load操作和update的操作,不需要Hibernate自己来判断究竟是save还是update了。我们要注意的只是child对象的操作。另外unsaved-value是定义在Child类的主键属性中的。
如果主键属性不是对象型,而是基本类型,如int/long/double/...,那么你需要指定一个数值型的unsaved-value,
例如:
在此提醒大家,很多人以为对主键属性定义为int/long,比定义为Integer/Long运行效率来得高,认为基本类型不需要进行对象的封装和解构操作,因此喜欢把主键定义为int/long的。但实际上,Hibernate内部总是把主键转换为对象型进行操作的,就算你定义为int/long型的,Hibernate内部也要进行一次对象构造操作,返回给你的时候,还要进行解构操作,效率可能反而低也说不定。因此大家一定要扭转一个观点,在Hibernate中,主键属性定义为基本类型,并不能够比定义为对象型效率来的高,而且也多了很多麻烦,因此建议大家使用对象型的Integer/Long定义主键。
4X1pG_#M,t \%Fwww.yoy1.comunsaved-value="none"和 悠忆社区/V,tq9fs
unsaved-value="any"
i,Zc?n"c主主要用在主键属性不是通过Hibernate生成,而是程序自己setId()的时候。www.yoy1.com#m4iCO'n\$T
在这里多说一句,强烈建议使用Hibernate的id generator,或者你可以自己扩展Hibernate的id generator,特别注意不要使用有实际含义的字段当做主键来用!例如用户类User,很多人喜欢用用户登陆名称做为主键,这是一个很不好的习惯,当用户类和其他实体类有关联关系的时候,万一你需要修改用户登陆名称,一改就需要改好几张表中的数据。偶合性太高,而如果你使用无业务意义的id generator,那么修改用户名称,就只修改user表就行了。
h^&h8c:b-I1]'Z*G3X Il*I悠忆社区由这个问题引申出来,如果你严格按照这个原则来设计数据库,那么你基本上是用不到手工来setId()的,你用Hibernate的id generator就OK了。因此你也不需要了解当社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯(r9j.@%u:s@4k_7P,P
unsaved-value="none"和 社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯t;P|_0R+vy,g)z6H
unsaved-value="any"社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯7W'N0W9W'R\
究竟有什么含义了。如果你非要用assigned不可,那么继续解释一下:b i9d e1W[B
unsaved-value="none" 的时候,由于不论主键属性为任何值,都不可能为none,因此Hibernate总是对child对象发送update(child)社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯 C5pm
x.o:o
unsaved-value="any" 的时候,由于不论主键属性为任何值,都肯定为any,因此Hibernate总是对child对象发送save(child)社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯G.H#n&WK6WZYWB
大多数情况下,你可以避免使用assigned,只有当你使用复合主键的时候不得不手工setId(),这时候需要你自己考虑究竟怎么设置unsaved-value了,根据你自己的需要来定。
强烈不建议使用composite-id,强烈建议使用UserType。
因此,如果你在系统设计的时候,遵循如下原则:Y?GS*w
OKYw
1、使用Hibernate的id generator来生成无业务意义的主键,不使用有业务含义的字段做主键,不使用assigned。社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯:EOs7Z$P"`6h
2、使用对象类型(String/Integer/Long/...)来做主键,而不使用基础类型(int/long/...)做主键社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯\MJ%d\b
TI
3、不使用composite-id来处理复合主键的情况,而使用UserType来处理该种情况。
#yo9LLlU a
那么你永远用的是unsaved-value="null" ,不可能用到any/none/..了。S1TDw-\%nSX0Q5e}
java 代码
- CODE:
- Session session = ...;
- Transaction tx = ...;
- Parent parent = (Parent) session.load(Parent.class, id);
- Child child = new Child();
- child.setParent(parent);
- child.setName("sun");
- parent.addChild(child);
- s.update(parent);
- s.flush();
- tx.commit();
- s.close();
在上例中,程序并没有显式的session.save(child); 那么Hibernate需要知道child究竟是一个临时对象,还是已经在数据库中有的持久对象。如果child是一个新创建的临时对象(本例中就是这种情况),那么Hibernate应该自动产生session.save(child)这样的操作,如果child是已经在数据库中有的持久对象,那么Hibernate应该自动产生session.update(child)这样的操作。3^)N%Q(}z1U Q$x
因此我们需要暗示一下Hibernate,究竟child对象应该对它自动save还是update。在上例中,显然我们应该暗示Hibernate对child自动save,而不是自动update。那么Hibernate如何判断究竟对child是save还是update呢?它会取一下child的主键属性 child.getId() ,这里假设id是 java.lang.Integer类型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate认为child是新的内存临时对象,发送save,如果不相等,那么Hibernate认为child是已经持久过的对象,发送update。`_/Zw
mV-yWr
unsaved-value="null" (默认情况,适用于大多数对象类型主键 Integer/Long/String/...)
bj%l
T^T
c/d [社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯当Hibernate取一下child的Id,取出来的是null(在上例中肯定取出来的是null),和unsaved-value设定值相等,发送save(child)
[YF5Wq*L%P LxC当Hibernate取一下child的id,取出来的不是null,那么和unsaved-value设定值不相等,发送update(child)
(U`cCowww.yoy1.com例如下面的情况:
java 代码
- CODE:
- Session session = ...;
- Transaction tx = ...;
- Parent parent = (Parent) session.load(Parent.class, id);
- Child child = (Child) session.load(Child.class, childId);
- child.setParent(parent);
- child.setName("sun");
- parent.addChild(child);
- s.update(parent);
- s.flush();
- tx.commit();
- s.close();
child已经在数据库中有了,是一个持久化的对象,不是新创建的,因此我们希望Hibernate发送update(child),在该例中,Hibernate取一下child.getId(),和unsave-value指定的null比对一下,发现不相等,那么发送update(child)。
9V3LiPW+i社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯BTW: parent对象不需要操心,因为程序显式的对parent有load操作和update的操作,不需要Hibernate自己来判断究竟是save还是update了。我们要注意的只是child对象的操作。另外unsaved-value是定义在Child类的主键属性中的。
java 代码
- CODE:
- <class name="Child" table="child">
- "id" name="id" type="integer" unsaved-value="null">
- class="identity"/>
- ...
- class>
如果主键属性不是对象型,而是基本类型,如int/long/double/...,那么你需要指定一个数值型的unsaved-value,
例如:
在此提醒大家,很多人以为对主键属性定义为int/long,比定义为Integer/Long运行效率来得高,认为基本类型不需要进行对象的封装和解构操作,因此喜欢把主键定义为int/long的。但实际上,Hibernate内部总是把主键转换为对象型进行操作的,就算你定义为int/long型的,Hibernate内部也要进行一次对象构造操作,返回给你的时候,还要进行解构操作,效率可能反而低也说不定。因此大家一定要扭转一个观点,在Hibernate中,主键属性定义为基本类型,并不能够比定义为对象型效率来的高,而且也多了很多麻烦,因此建议大家使用对象型的Integer/Long定义主键。
4X1pG_#M,t \%Fwww.yoy1.comunsaved-value="none"和 悠忆社区/V,tq9fs
unsaved-value="any"
i,Zc?n"c主主要用在主键属性不是通过Hibernate生成,而是程序自己setId()的时候。www.yoy1.com#m4iCO'n\$T
在这里多说一句,强烈建议使用Hibernate的id generator,或者你可以自己扩展Hibernate的id generator,特别注意不要使用有实际含义的字段当做主键来用!例如用户类User,很多人喜欢用用户登陆名称做为主键,这是一个很不好的习惯,当用户类和其他实体类有关联关系的时候,万一你需要修改用户登陆名称,一改就需要改好几张表中的数据。偶合性太高,而如果你使用无业务意义的id generator,那么修改用户名称,就只修改user表就行了。
h^&h8c:b-I1]'Z*G3X Il*I悠忆社区由这个问题引申出来,如果你严格按照这个原则来设计数据库,那么你基本上是用不到手工来setId()的,你用Hibernate的id generator就OK了。因此你也不需要了解当社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯(r9j.@%u:s@4k_7P,P
unsaved-value="none"和 社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯t;P|_0R+vy,g)z6H
unsaved-value="any"社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯7W'N0W9W'R\
究竟有什么含义了。如果你非要用assigned不可,那么继续解释一下:b i9d e1W[B
unsaved-value="none" 的时候,由于不论主键属性为任何值,都不可能为none,因此Hibernate总是对child对象发送update(child)社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯 C5pm
x.o:o
unsaved-value="any" 的时候,由于不论主键属性为任何值,都肯定为any,因此Hibernate总是对child对象发送save(child)社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯G.H#n&WK6WZYWB
大多数情况下,你可以避免使用assigned,只有当你使用复合主键的时候不得不手工setId(),这时候需要你自己考虑究竟怎么设置unsaved-value了,根据你自己的需要来定。
强烈不建议使用composite-id,强烈建议使用UserType。
因此,如果你在系统设计的时候,遵循如下原则:Y?GS*w
OKYw
1、使用Hibernate的id generator来生成无业务意义的主键,不使用有业务含义的字段做主键,不使用assigned。社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯:EOs7Z$P"`6h
2、使用对象类型(String/Integer/Long/...)来做主键,而不使用基础类型(int/long/...)做主键社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯\MJ%d\b
TI
3、不使用composite-id来处理复合主键的情况,而使用UserType来处理该种情况。
#yo9LLlU a
那么你永远用的是unsaved-value="null" ,不可能用到any/none/..了。S1TDw-\%nSX0Q5e}
发表评论
-
java mysql 备份
2007-08-08 11:37 4993首先,设置mysql的环境变量(在path中添加%MYSQL_ ... -
用ajax实现级联菜单
2007-08-08 11:35 3077张盈盈 11:15:18 <script> ... -
网页定位问题
2007-06-09 17:08 2117问题:一个网页显示了10道题,我看到第8道,发现它有错误,通过 ... -
hibernate 中 inverse的设置对效率的影响
2007-05-26 16:00 2361java 代码 双向关联与inverse设定 ... -
Hibernate提供了以下几种内置标识符生成器
2007-04-24 11:25 2162Generator元素用来设定标识符生成器.Hibernate ... -
hibernate的父子关系及inverse
2007-04-24 10:25 1951inverse="true"的问题 inv ... -
Hibernate中outer-join、lazy 、fetch join关键字的使用
2007-04-24 09:48 133121、outer-join关键字(many-to ... -
sun.net.ftp.FtpClient的函数说明
2007-03-20 16:23 11732sun.net.ftp.FtpClient.,该类库主要提供了 ... -
JAVA操作Excel的方法
2007-03-17 11:11 1967此操作使用POI类库,请到以下URL下载: http ... -
小知识点
2007-03-11 14:14 14851从C盘的目录切换到D盘,不用cd命令,直接输入 C:\Doc ... -
Linux Squid 代理修改配置
2007-03-09 13:59 1674附件中 -
jstl(jsp标准标签)
2007-02-02 17:00 1469附件中 -
spring mvc 中文乱码问题解决
2007-01-29 16:35 11452在eclipse环境里,页面传输数据的时候通常用ISO-885 ... -
Dom4j的使用(全而好的文章)
2007-01-24 17:43 136977Dom4j 使用简介 作者: ... -
dom4jAPI[1]--用dom4j建立,修改XML文档,并解决格式化输出和中文问题
2007-01-24 16:41 4740import java.io.File;<o:p> ... -
MD5加密的Java Bean
2007-01-22 09:20 1985MD5 算法的Java Bean- - ... -
spring配置中<context-param> 和<init-param>的 区别
2007-01-11 13:48 4531如果我们直接作为tomcat中的一部分.那么我们一定要用con ... -
log4j详解
2007-01-07 15:08 2662...
相关推荐
5. `unsaved-value`:这个属性用于标记新创建且尚未保存的实例。它的值通常是某个字段的特殊值,用于区分已保存和未保存的实例。 6. `access`:与`default-access`类似,`access`参数也定义了访问对象属性的策略,...
<id name="id" unsaved-value="0"> <property name="name" not-null="true"/> <loader query-ref="person"/> <sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert> <sql-update...
如果对象的标识属性值等于`unsaved-value`,Hibernate会认为该实例是新创建的,需要执行`save`操作;否则,执行`update`操作。 4. 主键生成器(Key Generator):用于决定如何生成对象的唯一标识(主键)。`...
<id name="id" unsaved-value="null"> ``` 2. **sequence**: 此策略适用于支持序列的数据库,如Oracle。你需要指定一个序列名,如下所示: ```xml <id name="id" unsaved-value="0"> ...
在这个配置中,`<version>`标签用于声明乐观锁的版本字段,`column`属性指定数据库对应的列名,`unsaved-value`属性表示未保存的初始值。 在实际的业务逻辑中,当我们试图更新一个用户时,Hibernate会在更新SQL语句...
- **关于unsaved-value**:解析了unsaved-value的概念及其应用场景。 - **Inverse和Cascade**:解释了这两个属性的意义以及如何正确使用它们。 - **延迟加载(LazyLoading)**:介绍了延迟加载的概念及其在...
这里的`hibernate-mapping`元素是整个配置文件的根节点,包含了关于实体类映射的所有信息。 ##### 2. 实体类映射 在`hibernate-mapping`元素内部,使用`class`元素来定义具体的实体类映射规则。 ```xml ... ```...
Hibernate采用的是数据版本对比策略,通过比较对象的unsaved-value和目标对象的id来决定是否需要更新。 最后,数据缓存是提高性能的关键。Hibernate提供了两个级别的缓存:内部缓存(一级缓存)和二级缓存。一级...
- **关于unsaved-value**:这是Hibernate中的一种特殊属性设置,用于标识某个属性在对象未保存前的默认值。 - **Inverse和Cascade**:用于控制关联关系中对象的级联操作。 - **延迟加载(LazyLoading)**:这是一种...
- **数据访问**:探讨了PO(Plain Old Java Object)和VO(Value Object)的区别,以及unsaved-value、Inverse和Cascade、延迟加载等概念。 - **事务管理**:介绍了基于JDBC和JTA的事务处理方法。 - **锁机制**:讲解...
<id name="id" type="string" unsaved-value="null"> <column name="cat_id" sql-type="varchar(20)" not-null="true"/> <column name="NAME" sql-type="varchar(20)" not-null="true"/> </...
- **数据访问**:讨论PO(Persistent Object)和VO(Value Object)的区别,以及unsaved-value属性的作用,深入解析Inverse和Cascade机制,解释延迟加载(Lazy Loading)的原理和应用场景。 - **事务管理**:分析...
此外,还讨论了unsaved-value、Inverse和Cascade等概念,以及延迟加载机制,这些都是理解Hibernate数据访问模式的关键。 #### 事务管理与锁机制 事务管理是任何数据库操作中不可或缺的一部分,文档不仅阐述了基于...