知识大全 Java 中关于 unsaved-value 的问题

Posted 操作

篇首语:这个世界有两个我,一个假装快乐,一个真心难过。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java 中关于 unsaved-value 的问题相关的知识,希望对你有一定的参考价值。

Java 中关于 unsaved-value 的问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  unsaved value是表示一个对象是新的还是旧的 如果unsaved value=none 那么就是新的 就会被insert到数据库中 如果unsaved value=any 就是说明对象是从数据库中load的 被update到数据库中     我的问题是 unsaved value是由我们来强制说明这个对象是新的还是旧的 那如果我把一个对象的unsaved value设置为any 那我要new 一个对象 把他save到数据库中 怎么做呢?我感觉这不是矛盾了吗?主要是我们在写配置文件的时候怎么能说一个对象就一定是new的还是load的?     当你显式的使用session save()或者session update()操作一个对象的时候 实际上是用不到unsaved value的 某些情况下(父子表关联保存) 当你在程序中并没有显式的使用save或者update一个持久对象 那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象 是一个尚未被持久化过的内存临时对象 例如     代码:   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();   mit();   s close();       在上例中 程序并没有显式的session save(child); 那么Hibernate需要知道child究竟是一个临时对象 还是已经在数据库中有的持久对象 如果child是一个新创建的临时对象(本例中就是这种情况) 那么Hibernate应该自动产生session save(child)这样的操作 如果child是已经在数据库中有的持久对象 那么Hibernate应该自动产生session update(child)这样的操作     因此我们需要暗示一下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     unsaved value= null (默认情况 适用于大多数对象类型主键 Integer/Long/String/ )     当Hibernate取一下child的Id 取出来的是null(在上例中肯定取出来的是null) 和unsaved value设定值相等 发送save(child)     当Hibernate取一下child的id 取出来的不是null 那么和unsaved value设定值不相等 发送update(child)     例如下面的情况     代码:   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();   mit();   s close();     child已经在数据库中有了 是一个持久化的对象 不是新创建的 因此我们希望Hibernate发送update(child) 在该例中 Hibernate取一下child getId() 和unsave value指定的null比对一下 发现不相等 那么发送update(child)     B: parent对象不需要操心 因为程序显式的对parent有load操作和update的操作 不需要Hibernate自己来判断究竟是save还是update了 我们要注意的只是child对象的操作 另外unsaved value是定义在Child类的主键属性中的     代码:   <class name= Child table= child >   <id column= id name= id type= integer unsaved value= null >    <generator class= identity />   </id>      </class>     如果主键属性不是对象型 而是基本类型 如int/long/double/ 那么你需要指定一个数值型的unsaved value 例如     代码:   unsaved null=     在此提醒大家 很多人以为对主键属性定义为int/long 比定义为Integer/Long运行效率来得高 认为基本类型不需要进行对象的封装和解构操作 因此喜欢把主键定义为int/long的 但实际上 Hibernate内部总是把主键转换为对象型进行操作的 就算你定义为int/long型的 Hibernate内部也要进行一次对象构造操作 返回给你的时候 还要进行解构操作 效率可能反而低也说不定 因此大家一定要扭转一个观点 在Hibernate中 主键属性定义为基本类型 并不能够比定义为对象型效率来的高 而且也多了很多麻烦 因此建议大家使用对象型的Integer/Long定义主键     unsaved value= none 和   unsaved value= any     主主要用在主键属性不是通过Hibernate生成 而是程序自己setId()的时候     在这里多说一句 强烈建议使用Hibernate的id generator 或者你可以自己扩展Hibernate的id generator 特别注意不要使用有实际含义的字段当做主键来用!例如用户类User 很多人喜欢用用户登陆名称做为主键 这是一个很不好的习惯 当用户类和其他实体类有关联关系的时候 万一你需要修改用户登陆名称 一改就需要改好几张表中的数据 偶合性太高 而如果你使用无业务意义的id generator 那么修改用户名称 就只修改user表就行了     由这个问题引申出来 如果你严格按照这个原则来设计数据库 那么你基本上是用不到手工来setId()的 你用Hibernate的id generator就OK了 因此你也不需要了解当     unsaved value= none 和   unsaved value= any     究竟有什么含义了 如果你非要用assigned不可 那么继续解释一下     unsaved value= none 的时候 由于不论主键属性为任何值 都不可能为none 因此Hibernate总是对child对象发送update(child)     unsaved value= any 的时候 由于不论主键属性为任何值 都肯定为any 因此Hibernate总是对child对象发送save(child)     大多数情况下 你可以避免使用assigned 只有当你使用复合主键的时候不得不手工setId() 这时候需要你自己考虑究竟怎么设置unsaved value了 根据你自己的需要来定     B: Gavin King强烈不建议使用posite id 强烈建议使用UserType     因此 如果你在系统设计的时候 遵循如下原则      使用Hibernate的id generator来生成无业务意义的主键 不使用有业务含义的字段做主键 不使用assigned      使用对象类型(String/Integer/Long/ )来做主键 而不使用基础类型(int/long/ )做主键      不使用posite id来处理复合主键的情况 而使用UserType来处理该种情况     那么你永远用的是unsaved value= null 不可能用到any/none/ 了 cha138/Article/program/Java/Javascript/201311/25399

相关参考

知识大全 C#中关于IsPostBack的解释

C#中关于IsPostBack的解释  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

下列各项中关于《诗经》的表述正确的是

下列各项中关于《诗经》的表述正确的是_____。A、“关关雎鸠,在河之洲。窈窕淑女,君子好逑”的诗句引自《诗经》B、《诗经》是我国浪漫主义文学的源头C、《诗经》大量运用了赋、比、兴的艺术表现手法D、“

知识大全 Delphi中关于动态代理应用技巧

Delphi中关于动态代理应用技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本来想上周末没能用

知识大全 C#中关于DateTime的两个实用方法

C#中关于DateTime的两个实用方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  获取某段

知识大全 .net中关于企业Excel报表的生成

.net中关于企业Excel报表的生成  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在一般的企

知识大全 WCF中关于自定义MessageHeader支持

WCF中关于自定义MessageHeader支持  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 .net中关于ASP.NET的简单介绍

.net中关于ASP.NET的简单介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  共享对象类

下列说法中关于水泥石的说法正确的有( )。

下列说法中关于水泥石的说法正确的有()。A.采用氢氧化钙含量少的水泥,可提高水泥石对软水等侵蚀性液体的抵抗能力B.通过降低水灰比.改善施工方法等措施,可提高水泥石的密实度C.软水不会侵蚀水泥石D.在水

下列说法中关于水泥石的说法正确的有( )。

下列说法中关于水泥石的说法正确的有()。A.采用氢氧化钙含量少的水泥,可提高水泥石对软水等侵蚀性液体的抵抗能力B.通过降低水灰比.改善施工方法等措施,可提高水泥石的密实度C.软水不会侵蚀水泥石D.在水

知识大全 VB.NET中关于DataGrid颜色的自定义

VB.NET中关于DataGrid颜色的自定义  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  近