打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
hibernate中的对象
注意:讨论的前提是主键最好是不含有任何业务逻辑含义的。
Hibernate里再三推荐使用这种主键,因为主键的选择满足以下几点:
1,不能为null
2,每行中只有唯一的值
3,特定行中的相应值不能改变
既然谁也无法保证业务相关的属性不会改变,那么选择一个纯粹意义上的功能单一的(唯一的功能就是做主键唯一标识DB中的一行)主键省了很多麻烦。
 
hibernate中的对象有三种状态:transient,persisitent,detached
一,transient object
Hibernate中,用new创建的对象不会马上持久,此时的状态为transient,意味着,这些对象还没有跟数据库表中的某一行相关联,一旦它们不再被程序中的其他对象引用,它们的寿命到此为止,要被gc回收了。在hibernate中,transient对象都是非事务性的,它们状态的改变不会影响任何事务的上下文环境,由此可知,hibernate不提供transient对象的回滚。实际上,hibernate不回滚任何对象的变化。transient对象只能被transient对象引用。
 
二,persisitent object
有一个主键集作为其在数据库中的identifier(标识)的对象就是persisitent对象。产生persisitent对象有两种方法:
1,对一个transient对象(即由应用程序创建的对象)调用持续管理器(Persistence Manager)的API的Session的save()方法
2,由一个已经存在的persistent对象创建的对象实例就是persisitent对象
persisitent对象总是跟Seesion相关联的,并且是事务性的,它参与到事务中去,在事务结束时,它们的状态和数据库相同步。
当一个persisitent对象分配到了一个主键值,但没有插入到数据库中去,称之为new persisitent instance,在与数据库同步之前,它一直是new persisitent instance。
 
Automatic dirty checking:自动检查事务中的persisitent对象是否被应用程序修改过。如果一个对象被修改过,但是这个修改并没有提交到数据库,此时就认为这个对象是dirty
 
从DB中remove一个persisitent对象所对应的行,则该对象就变成transient对象了。
 
三,detached object
当事务完成后,与Session相关联的persisitent对象仍然存在,仍是persisitent的,直到调用Session 的close()方法关闭会话。会话关闭后,对象称为detached,表明它们的状态不再保证与数据库同步,不在Persistence Manager的管理之下了。但此时,detached的对象仍然包含persisitent数据,应用程序也可能可以获取这个对象的实例。 Hibernate允许用一个新的Session与之相关联,在一个新的事务中重用这个对象。
 
Hibernate辨别一个对象是transient对象还是detached对象的方法:
1,如果存在identifier属性的话,判断是否为null,如果为null则为trasient对象
2,如果存在version属性的话,判断是否为null,如果为null则为trasient对象
3,在映射文件中为class或version提供一个"unsaved-value"的属性,当对象中相应的属性(类的是identifier属性,version就是version属性)的值等于文件中定义的"unsaved-value"的值,那么该对象就是transient对象。
4,在代码中使用Interceptor.isUnsaved()方法,如果返回为Boolean.TRUE的话,则为trasient对象
 
其中还谈到对象的辨别,即如何辨别persisitent对象对应于DB中的同一行,这就涉及到persisitent类的equals()方法和hashcode()方法的实现问题,方法有多种,大多都有或多或少的隐患,有一种比较合适,就是使用business key equality(业务键相等),一个business key是一个或几个属性的联合,唯一标识每一个对象,并且对应于DB中相同的identifier。每个实体都应该有business key,用以唯一标识一条特殊的记录。
 
关于Session,创建一个Session的开销很小,因为它不获取JDBC连接,不执行任何SQL语句,直到需要的时候才获取,需要与DB 同步时,调用事务的commit()方法,此时Hibernate获得了JDBC的一个连接,并执行SQL语句,当Session关闭时,JDBC连接也被释放了。从session.beginTransaction()到commit()方法之间发生的一系列操作,都认为是在同一个事务中的操作。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Hibernate三种状态的区分,以及save,update,saveOrUpd
Hibernate中实体对象的生命周期
Hibernate 中的attachDirty,attachClean,merge之间的区别
Hibernate 笔记3 关于SessionFactory,Session 以及 三大状态(Transient、Persistent、Detached)
Hibernate面试问题
翻译的Hibernate的Session的javadoc
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服