《传智播客hibernate李勇经典》由会员分享,可在线阅读,更多相关《传智播客hibernate李勇经典(50页珍藏版)》请在金锄头文库上搜索。
1、北京传智播客教育 ,Hibernate原理与应用,讲师:李勇,北京传智播客教育 ,主要内容,引入 安装配置 基本概念和CURD HQL和Criteria 关联映射 继承映射 集合映射 懒加载 缓存 事务 其他 Hibernate不适合的场景 与JPA的集成(annotation方式) 最佳实践,北京传智播客教育 ,引入,模型不匹配(阻抗不匹配) Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等;数据库是关系模型,其主要概念有:表、主键、外键等。 解决办法 1使用JDBC手工转换。 2使用ORM(Object Relation Mapping对象关系映射)框架来解决,主流的ORM
2、框架有Hibernate、TopLink、OJB。,北京传智播客教育 ,安装配置,下载地址http:/www.hibernate.org,本教程使用3.2.5。 将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中: antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar,北京传智播客教育 ,安装配置,配置文件hibernate.cfg.xml和hibernate.properties,XML和properties
3、两种,这两个文件的作用一样,提供一个即可,推荐XML格式,下载目录/etc下是示例配置文件。 可以在配置文件指定: 数据库的URL、用户名、密码、JDBC驱动类、方言等。 启动时Hibernate会在CLASSPATH里找这个配置文件。 映射文件(hbm.xml,对象模型和关系模型的映射)。在/eg目录下有完整的hibernate示例。 快速开始小例子,北京传智播客教育 ,基本概念和CURD,开发流程 1由Domain object - mapping-db。(官方推荐) 2由DB开始,用工具生成mapping和Domain object。(使用较多) 3由映射文件开始。,北京传智播客教育 ,
4、基本概念和CURD,Domain Object限制 1.默认的构造方法(必须的)。 2有无意义的标示符id(主键)(可选) 3非final的,对懒加载有影响(可选) Domain Java Object(User) public class User private int id; private String name; private Date birthDay; /getter setter ,北京传智播客教育 ,基本概念和CURD,1.hbm.xml 主键生成器,参考文档P65 5.1.4 2.详细信息见参考文档P62,北京传智播客教育 ,基本概念和CURD,Java代码 1.初始化代
5、码(只做一次) Configuration cfg = new Configuration(); cfg.configure(“config.cfg.xml”); 也可以通过cfg.setProperty设置属性。 SessionFactory sessionFactory = cfg.buildSessionFactory(); 2.模板代码 Session session = null;Transaction tx = null; try session = sessionFactory.openSession(); tx = session.beginTransaction(); /你的
6、代码save,delete,update,get mit(); catch(Exception e) if(tx !=null)tx.rollback();throw e; finally if(session != null)session.close(); ,北京传智播客教育 ,基本概念和CURD,Session的几个主要方法 1.save,persist保存数据,persist在事务外不会产生insert语句。 2.delete,删除对象 3.update,更新对象,如果数据库中没有记录,会出现异常。 4.get,根据ID查,会立刻访问数据库。 5.Load,根据ID查,(返回的是代理,
7、不会立即访问数据库)。 6.saveOrUpdate,merge(根据ID和version的值来确定是save或update),调用merge你的对象还是托管的。 7.lock(把对象变成持久对象,但不会同步对象的状态)。,北京传智播客教育 ,对象状态,瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。 持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检
8、测到)。 脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。,北京传智播客教育 ,对象状态,北京传智播客教育 ,HQL和Criteria,HQL(Hibernate Query Language) 面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;HQL主要通过Query来操作,Query的创建方式: Query q = session.createQuery(hql); from Person from
9、User user where user.name=:name from User user where user.name=:name and user.birthday :birthday Criteria Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式: Criteria crit = session.createCriteria(DomainClass.class); 简单属性条件如:criteria.add(Restrictions.eq(propertyName, value), criteria.add(Restrictions.eqPropert
10、y(propertyName,otherPropertyName),北京传智播客教育 ,基本功能练习,实现UserDao public interface UserDao public void saveUser(User user); public User findUserById(int id); public User findUserByName(String name); public void updateUser(User user); public void remove(User user); ,北京传智播客教育 ,基本功能练习,实验步骤: 1.设计domain对象User
11、。 2.设计UserDao接口。 3.加入hibernate.jar和其依赖的包。 4.编写User.hbm.xml映射文件,可以基于hibernate/eg目录下的org/hibernate/auction/User.hbm.xml修改。 5.编写hibernate.cfg.xml配置文件,可以基于hibernate/etc/hibernate.cfg.xml修改;必须提供的几个参数: connection.driver_class、connection.url、connection.username、connection.password、dialect、hbm2ddl.auto。 6.编
12、写HibernateUtils类,主要用来完成Hibnerate初始化和提供一个获得Session的方法;这步可选。 7.实现UserDao接口。,北京传智播客教育 ,关联映射,多对一(Employee - Department) 一对多(Department-Employee) 一对一(room - door) 多对多(teacher - student) 组件映射(User-Name) 集合映射(set, list, map, bag) inverse和cascade(Employee Department),北京传智播客教育 ,关联映射,多对一(Employee - Department
13、) 映射文件 ER图,北京传智播客教育 ,关联映射,一对多(Department-Employee) ,北京传智播客教育 ,关联映射,一对一(Person - IdCard) 1)基于主键的one-to-one(person的映射文件) idCard ,北京传智播客教育 ,关联映射,一对一(Person - IdCard) 2)基于外健的one-to-one,可以描述为多对一,加unique=“true”约束 property-ref用于指定关联类的一个属性,这个属性将会和本外键相对应 ,北京传智播客教育 ,关联映射,多对多(teacher - student) 在操作和性能方面都不太理想,所
14、以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。 ,北京传智播客教育 ,关联映射,组件映射(User-Name) 关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要之久保存的。 当组件的属性不能和表中的字段简单对应的时候可以选择实现: org.hibernate.usertype. UserType或 org.hibernate.usertype. CompositeUserType,北京传智播客教育 ,继承映射,对象模型(Java类结构),北京传智播客教育 ,继承映射,一个类继承
15、体系一张表(subclass)(表结构),北京传智播客教育 ,继承映射,一个类继承体系一张表(subclass)(映射文件) ,北京传智播客教育 ,继承映射,每个子类一张表(joined-subclass) (表结构),北京传智播客教育 ,继承映射,每个子类一张表(joined-subclass) (映射文件) ,北京传智播客教育 ,继承映射,混合使用“一个类继承体系一张表”和“每个子类一张表” (表结构),北京传智播客教育 ,继承映射,混合使用“一个类继承体系一张表”和“每个子类一张表” (映射文件) ,北京传智播客教育 ,继承映射,每个具体类一张表(union-subclass) (表结构),北京传智播客教育 ,继承映射,每个具体类一张表(union-subclass) (映射文件) 主健不能是ide