您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Hibernate 学习笔记
1.在Hibernate中实现增加(修改,删除)操作的步骤2.Java基本数据类型与hibernate基本数据类型的对应关系3.Hibernate基本语义4.事务管理5.实体对象生命周期6.Session详解7.集合映射8.Hibernate对象关联关系9.HQL查询10.Hibernate检索策略11.Criteria查询12.Example示例查询13.命名查询14.本地SQL查询15.数据批处理与存储过程16.Hibernate缓存技术17.Hibernate注解在Hibernate中实现增加(修改,删除)操作的步骤1.读取并解析配置文件Configurationconfig=newConfiguration().configure();2.读取并解析映射信息,并创建SessionFactorySessionFactorysessionfactory=config.buildSessionFactory();3.打开sessionthis.session=sessionfactory.openSession();4.打开一个事务(增删改必选,查询可选)tran=this.session.beginTransaction();5.持久化操作this.session.save(login);(增加操作)this.session.update(login);(修改操作)this.session.dalete(login)(删除操作)6.提交事务tran.commit();7.关闭sessionThis.session.close();注:update(),delete()更新条件是主键其对应sql语句为updatetablecolumn=?wherepk=?;所以测试类中一定要有设置主键Java基本数据类型与hibernate基本数据类型的对应关系Java基本数据类型hibernate基本数据类型Byte,(java.lang.Byte)byteShort,(java.lang,Short)shortInt,(java.lang.Integer)integerLong,(java.lang.Lang)longFloat,(java.lang.Float)floatDouble,(java.lang.Double)doubleJava.math.BigDecimalbig_decimalChar,(java.lang.Character)charaterbooleanBoolean,(java.lang.Boolean)yes_notrue_falseJava.lang.StringStringJava.util.Date,java.sql.datedate(日期YYYY-MM-DD)Java.util.Date,java.sql.timetime(时间HH:MM:SS)Java.util.Date,java.sql.timestampstamp(日期时间YYYY-MM-DDHH:MM:SS)Java.util.Calendarcalendar(日期时间YYYY-MM-DDHH:MM:SS)calendar_date(日期YYYY-MM-DD)byte[]binaryjava.lang.Stringtextjava.io.Serializableserializablejava.sql.Clobclobjava.sql.Blobblobjava.lang.Classclassjava.util.Localelocalejava.util.TimeZonetimezonejava.util.CurrencycurrencyClass:当前类名able:当前表名schema:用户模式Id:表中主键名type:字段类型column:表中字段名length:字段长度Generator:增加模式(assigned用户决定)(incrementHibernate自增)property:类属性名Not-null:是否不能为空Hibernate基本语义Configuration对hibernate进行初始化操作只进行一次。初始化时必须对其提供以下信息:1.数据库URL2.数据库用户名3.数据库用户密码4.数据库JDBC驱动类5.数据库dialect,用于对特定数据库提供支持,其中提供了对特定数据库特性的实现(一般为hibernate.cfg.xml,也可指定其他配置文件但必须为xml文件)Filefile=newFile(“C:\\sample\\myhibernate.xml”)Configurationconfig=newConfiguration().config(file);SessionFactory负责创建Sssion实例Configurationconfig=newConfiguration().config();SessionFactorysessionfactory=config.buildSessionFactory();Session持久层操作的基础,相当于JDBC的ConnectionFlush()方法,强制同步到数据库中在事务中hibernate会自动执行flush();Session关闭时也会自动执行flush();事务管理1.Hibernate是JDBC的轻量级封装,本身并不具备事务管理功能2.Hibernate是将事务管理委托给底层的JDBC(默认)或JTA(黄色部分为委托给JTA,注释部分为委托给JDBC)Hibernate对于JDBC的封装session=sessionFactory.openSession();Transactiontr=session.beginTransaction();session.save(user);tr.commit();基于JTA的事物管理1.JTA提供了跨Session的事物管理能力2.JTA事物管理则由JTA容器实现,JTA容器对当前加入事务的众多Connection进行调度3.JTA的事务周期可横跨多个JDBCConnection生命周期4.JTA事务是由JTAContainer维护,而参与事务的Connection无需对事务管理进行干涉锁机制1.业务逻辑实现过程中往往要保证数据访问的排他性2.给我们的目标上锁,使其无法被其他程序修改3.Hibernate支持两种锁机制:“悲观锁(PessimisticLocking)”和“乐观锁(OptimisticLocking)”悲观锁(PessimisticLocking)指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中将数据处于锁定状态Select*fromaccountwherename=”Erica”forupdateStringhqlStr=”fromTUserasuserwhereuser.name=’Erica’”;Queryquery=session.creatQuery(hqlStr);Query.setLockMode(“user”,LockMode.upgrade);加锁Listlist=query.list();//执行查询,获取数据Hibernate加锁模式1.LockMode.NONE:无所机制2.LockMode.WRITE:Hibernate在Insert和Update记录时会自动获取3.LockMode.READ:Hibernate在读取记录时会自动获取4.LockMode.UPGRADE:利用数据库的forupdate子句加锁5.LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的forupdatenowait子句实现加锁6.Criteria.setLockMode7.Query.setLockMode8.Session.lock乐观锁(OptimisticLocking)相对于悲观锁而言,乐观锁机制采取了更加宽松的加锁机制悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性乐观锁大多数情况下基于数据版本(Version)记录机制避免了长事务中的数据库加锁开销乐观锁往往基于系统中的数据存储逻辑,因此具有一定的局限性Hibernate在其数据访问引擎中内置了乐观锁实现实体对象生命周期实体对象实体对象指Hibernate的O/R映射关系中的域对象(O/R中的O);实体对象的生命周期是指实体对象由产生到被GC回收的一段过程,这段过程实体对象中有三种状态实体对象的三种状态自由状态:实体对象不处于Session的缓存中,并没有和任何一个Session关联,在数据库中没有对应记录持久状态:session开启后实体对象从自由状态转变为持久状态1.实体对象位于一个Session的缓存中,总是被一个Session实例关联2.持久化对象和数据库中的相关记录对应3.Session在清理缓存时,会根据持久化对象的属性变化来同步更新数据4.Session的save()方法(commit()之后)把实体对象从自由状态转变为持久状态5.Session的load()方法或get()方法返回的实体对象总是持久状态6.Session的update(),saveOrupdate(),,lock()方法使实体对象从游离状态转变为持久状态游离状态:session关闭后实体对象从持久状态转变为游离状态1.不在位于Session的缓存中,不被Session关联。2.游离状态是由持久状态转化过来的,一次在数据库中可能还存在与他对应的记录VO与POVO即时处于自由状态和游离状态下的实体对象,称值对象(ValueObject)是相对独立的对象,出了处与非管理状态PO即是处于持久状态下的实体对象,称为持久对象(PersistentObject)。是Hibernate纳入其管理容器的对象,代表数据中某条Hibernate实体,PO的变化在事务提交后将反映到数据库中。如果一个PO与Session分离,即变成VOSession详解Session接口Session接口提供了基本的保存,更新,删除和加载java对象的方法Session能够在某些时间点,按照缓存中对象的变化来执行相关SQL语句,同步更新数据库,这一过程被称为清理缓存(flush)Session管理Session不是线程安全的,所以让多个线程共享一个Session发生数据冲突,所以Session需要管理ThreadLocal模式:ThreadLocal并不是一个线程的本地实现,即他不是一个线程(Thread),而是一个线程局部变量(Threadlocalvariable)。它的作用就是为每一个使用这个变量的线程都提供一个变量值的副本,并且每一个线程都可以独立的改变自己的副本,而不会和其他线程的副本产生冲突。publicclassDao{privateSessionsession;privateTransactiontran;//创建ThreadLocal对象privatestaticfinalThreadLocalSessiont=newThreadLocalSession();publicDao(){SessionFactoryfactory=newConfiguration().configure().buildSessionFactory();//Sessionsession=factory.openSession();this.session=(Session)t.get();//获取session的副本if(session==null){this.session=factory.openSession();t.set(session);//将session委托给ThreadLocal托管}}publicvoidsave(Loginlogin){try{tran=session.beginTransaction();session.save(
本文标题:Hibernate 学习笔记
链接地址:https://www.777doc.com/doc-4825814 .html