5dJava_笔记之-Hibernate.doc_第1页
5dJava_笔记之-Hibernate.doc_第2页
5dJava_笔记之-Hibernate.doc_第3页
5dJava_笔记之-Hibernate.doc_第4页
5dJava_笔记之-Hibernate.doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hibernate 简介数据持久化组件,对象持久化,把数据保存在永久的存储介质中(数据库)。对象持久化理论1 .把数据(内存中对象的数据)保存到持久设备(硬盘,磁带,DVD,闪存,打孔带)数据 库。2.内存易逝(容易丢失数据),容量小。3.优点:共享数据方便 管理(安全,备份) 大规模检索增值服务怎样进行对象持久化:1.JAVA 平台 对象序列化:一般用于远程方法调用。用于少量数据,短时间持久化。如购物车是内存中的对象,服务器维护2-3分钟,要序列化。2.JDBC+DB:为对象持久化而设计的企业级应用 。JDBC 优点:在一定条件下,从理论上效率高,功能完备,是最底层的 API。 缺点:代码量大,比较复杂。3.EJB:封装了 JDBC,但 API 复杂,开发周期长,难于测试。4.ORM:来于民间,来源实践,纯面向对象,封装了 JDBC,适宜的 API 轻量级(可选的服务) 利用数据库做企业级对象持久化,一定用 Hibernate。开发环境1.建立 JAVA 普通项目2.创建 userlibrary引用 JAR 包1Hibernate_home/lib/*.jar Hibernate_home/hibernate3.jar Mysql 或者 JDBC 驱动3.给项目引用 userlibrary 库,把配置文件 hibernate.cfg.xml 放 src 下 。 定义映射文件实体类名.hbm.xml 配置映射关系。在 myeclipse 中配置 DTD 对 xml 校验:1,导入 hibernate 库文件(1)在 eclipse 中建立一个 java 工程,如:hbn(2)在工程 hbn 的属性-Build Path 中选择 Add Libraries(3)在 Add Libraries 窗口中选择 User Library 点 next 按钮(4)在 User Library 窗口中点 User Libraries .按钮(5)在 User Libraries 窗口中,点 new 按钮(6)在 New user library 窗口中,填写一个 User libary name(如:hbnlib,注意不要选择 Systemlibary 复选框),点 OK 按钮回到 User Liberies 窗口(7)在 User Liberaries 窗口中选择刚刚创建的hbnlib,点 Add jars 按钮(8)在打开的文件选择窗口中找到解压好的 hibernate 的库文件,全部选中,点打开 按钮,返回 User Libraries 窗口(9)在 User Libraries 窗口中点 OK 按钮,返回User Library 窗口;再点 Finish 按钮,结束操作2,导入 2 个 hibernate DTD 文件 hibernate-configuration-3.0.dtd hibernate-mapping-3.0.dtd(1)在 eclipse 中选择 Window 菜单中的 Preferences选项(2)在 Preferences 窗口中,选择 Files and Editors 的 XML 节点 中的 XML Catalog 子节点(3)在 XML catalog 子节点选中状态下,选择右侧 窗口中的 User Specified Entries 选项,然后 点窗口下方的 Add 按钮(4)在 Add XML Catalog Entry 窗口中,填写 URI 文 本框(点文本框右端的按钮,选择 file system, 在弹出的文件选择窗口中选择hibernate-3.2srcorghibernatehibernate-configuration-3.0.dtd(5)用文本编辑器打开该 DTD 文件,选择文件头部,标签中 PUBLIC 后状如:-/Hibernate/Hibernate Configuration DTD 3.0/EN的字符串,然后将该字符串拷贝到Add XML Catalog Entry 窗口中 Key 文本框中(6)对 hibernate-mapping-3.0.dtd 重复 4、5 两步2OR/M 对象关系映射object relation mappingPOJO 类,就是标准的 Java Bean。Hibernate 的工作原理:封装了 JDBC,Java 只能用 JDBC 访问数据库。Hibernate 就是一个可以自动的根据 xml 完成对象关系映射,并持久化到数据库的开源组件。 Hibernate 的底层也是有 JDBC 实现的。接口:session线程不安全的,轻量级的,一个线程一个 session 。sessionFactory 线程安全的,重量级的比较耗资源。类:configuration 读取配置文件数据库信息,正确连接数据库。 单一实体映射:单个 PO-单个表,类-表 ,对象-记录 ,属性-字段。 用不含业务关系的做主键。Oid(唯一性)hilo 算法,高低位算法。(每个应用程序一个计数器,从数据库里取出的数作为高位,应用 程序的作为低位,可以保证得到的 Oid 不重复,并且不用多次访问数据库。hibernate 是通过 xml 文件的配置,对数据库的底层的方言,以及数据库连接所需的信息, 以及连接数据库的驱动。hibernate 的 系 统 配 置 文 件 的 名 字 一 般 叫 做 hibernate.cfg.xml , 一 般 是 映 射 类 名 加.hbm.xml。一般将映射类的 xml 文件和实体类放在一起。hibernate.cfg.xml 中会设置数据库的连接信息,以及引用的其他文件的文件名,和一些其 他的设置。这个文件一般放在项目的根目录下。映射关系配置在 hibernate 中其他类型可以自动识别只有 Date 类型必须指定。在 hibernate.cfg.xml 的写法:3truetrueorg.gjt.mm.mysql.Driverjdbc:mysql:/:3306/zhaoqprootzhaoqp2none4!-org.hibernate.dialect.Oracle9Dialect-org.hibernate.dialect.MySQLDialecthibernate 的映射类的 XXXX.hbm.xml 的写法:1. Product.hbm.xml52. User.hbm.xml63. Order.hbm.xml74. Item.hbm.xml8主键生成策略id 生成方式sequence序列,只适用于 Oracleperson_seqIdentity自增列,适用于 SQLServerIncrement取最大值加 19native根据底层数据库指定生成方法针对 Oracle 数据库的生成方式还是 sequence,只不过需要一个特定名字的 sequence,hibernate_sequence。hilo高低位算法high_valuenext_value50assigned指定主键生成策略为用户指定sequence: 只在 oracle 中有。seqhilo: sequence 产生高位,用 hilo 计算,只用于 oracleidentity: 没有 sequence 的数据库(mysql),自增和 sequence 差不多,10效率比 sequence 高一点。native: 由 hibernate 判断该数据库能用哪种 sequenceidentity,根据 dialect 确认的. uuid.hex: 全球唯一的string 类型,varchar(255)不会额外访问数据库,效率很高, 只是浪费一些 CPU。单一实体映射类-表属性-字段public static void main(String args) Configuration cfg = new Configuration().configure();SessionFactory sf = cfg.buildSessionFactory();Session s = sf.openSession();Transaction tran = s.beginTransaction();Account act = new Account(act-002,1000.0);String hql = from Account a where a.bal ?;String hql2= from Account a where a.actNo = :actNo;try s.save(act);List l = s.createQuery(hql) .setDouble(1000.0).list();/确定只有一条时用 uniqueResult() 效率高Account act =(Account) s.createQuery(hql2).setString(actNo,act-102).uniqueResult();mit();s.close(); catch (HibernateException e) 11e.printStackTrace();tran.rollback();hibernate.cfg.xmltrueoracle.jdbc.driver.OracleDriverjdbc:oracle:thin::1521:zhaoqpzhaoqp1234562org.hibernate.dialect.Oracle9Dialect12Account.hbm.xmlt_hilohi!-t_hilo13hi- public class Account private Long oid;private String actNo;private double bal;public void withdraw(double amount)bal = bal - amount;public void deposite(double amount)bal = bal + amount;public Account() super();public Account(String actNo, double bal) super();14this.actNo = actNo;this.bal = bal;public String getActNo() return actNo;public void setActNo(String actNo) this.actNo = actNo;public double getBal() return bal;public void setBal(double bal) this.bal = bal;public Long getOid() return oid;public void setOid(Long oid) this.oid = oid;15关联关系映射基数关系映射:1:11:mn:m突出数量 组件关系映射:单一组件关系映射 ,集合组件关系映射突出强度a use b表是:a 里有一个 b 的属性是指向 b 的引用, 特点:方向,角色,名称,数量,强度,双边关系。小汽车和发动机是组合关系。 小汽车和收音机是聚合关系。聚合关系:两个节点之间可单独存在,分开后整体性质不变。3,继承关系映射(若干映射方案)4,值类型的集合映射(若干集合)基数关系映射一对一建表策略 分两种:1,共享主键,也就是一方引用另一方的主键,作为自身的主键,也是外键。2,外键引用,也就是一方引用另一方的主键,作为外键,并且对引用的外键加唯一约束。Account 表oid actNobalance fid1act-01100012Act-0210002User 表oid nameuseNo1jackuser-022mikeuser-01public class User private Long oid;private String name;private String userNo;private Account act;public class Account private Long oid;16private String actNo;private double bal;private User owner;Account:User:17如上情况如果是共享主键:user 表的 oid 与 Account 表的 oid 关联 User 改为:默认对方的主键就是外键 所以不用写 property-ref. Account 改为:owner18constrained 约束 Account 表的 oid 约束 User 表的 oid 表示这个表的主键也作为外键。oid 的产生方式根据主表,从外界取 owner 属性指向的 user 表 oid 的值。一对多1,建表策略,多方引用一方的主键当作外键。2,持久化对象,即就是在数据库中存有其相对应数据的对象,并且在内存中也有这个对象, 这个对象在 Session 的管理范围内,也就是调用过 save()方法同步到数据库的对象。3,临时对象,即在内存中刚刚创建的对象,还没有同步到数据库,或者是数据库中信息被 删除了的对象也是临时状态。3,游离对象,也就是在数据库中有和该对象向对应的纪录,并且在内存中的也存在该对象, 但是不在 Session 的管理范围之内,也就是在 Session 关闭之后,就成了游离对象,就不会 在将其改变同步到数据库中,如果要使还想令其成为持久化对象就要在把它纳入 Session 管理中,也就是掉用 Session 中的 update()方法就可以了。示例代码:public static void main(String args) Session s = HbnUtil.getSession();s.beginTransaction();User u = new User(Mike,user-001);u.addAct(new Account(act-001,1000.0);u.addAct(new Account(act-002,1000.0);s.save(u);s.getTransaction().commit();s.close();public static void main(String args) Session s = HbnUtil.getSession(); s.beginTransaction();String hql = from User u where u.userNo = ?;19User u = (User) s.createQuery(hql).setString(0,user-001).uniqueResult();StringBuffer sb = new StringBuffer();sb.append(u.getOid()+ +u.getUserNo()+n);Set acts = u.getActs();for(Account act : (Set)acts)sb.append(act.getActNo()+act.getOid()+n);System.out.println(sb.toString();s.getTransaction().commit();s.close();public class User private Long oid;private String name;private String userNo;private Set acts = new HashSet();public User() super();public User(String name, String userNo) super();20 = name;this.userNo = userNo;public Set getActs() return acts;public void setActs(Set acts) this.acts = acts;public void addAct(Account act) acts.add(act); act.setOwner(this);public String getName() return name;public void setName(String name) = name;public Long getOid() return oid;21public void setOid(Long oid) this.oid = oid;public String getUserNo() return userNo;public void setUserNo(String userNo) this.userNo = userNo;public class Account private Long oid;private String actNo;private double bal;private User owner;public void withdraw(double amount)bal = bal - amount;public void deposite(double amount)bal = bal + amount;22Overridepublic int hashCode() final int PRIME = 31;int result = 1;result = PRIME * result + (actNo = null) ? 0 : actNo.hashCode();return result;Overridepublic boolean equals(Object obj) if (this = obj)return true;if (obj = null)return false;if (getClass() != obj.getClass()return false;final Account other = (Account) obj;if (actNo = null) if (other.actNo != null)return false; else if (!actNo.equals(other.actNo)return false;return true;23public Account() super();public Account(String actNo, double bal) super();this.actNo = actNo;this.bal = bal;public String getActNo() return actNo;public void setActNo(String actNo) this.actNo = actNo;public double getBal() return bal;public void setBal(double bal) this.bal = bal;public Long getOid() 24return oid;public void setOid(Long oid) this.oid =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论