




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernateday011. 简介1) Hibernate框架开源、免费的软件框架2) 数据的2种表现形式运行在内存中object形式临时数据(transient)运行在数据库中table形式持久化数据(persisence)3) Hibernate目录结构docAPI帮助文档eg作者写的拍卖行的例子etcHibernate配置文件grammerhql语法(类似SQL)libHibernate需要的第三方Jar包srcHibernate源代码test测试hibernate3.jar核心jar包4) ORMappingl Object Relationship mapping l 对象数据库l 要求:类表对象行属性列oid主键(不是一个对象的固有属性)2. 搭建开发环境步骤1) 导入Jar包hibernate3.jarlib包下的所有Jar包ojdbc.jar2) hibernate.cfg.xml配置文件 openlab jdbc:oracle:thin:0:1521:tarena myoracle open123 oracle.jdbc.driver.OracleDriver org.hibernate.dialect.Oracle9Dialect true true 知识点:Oracle9Dialect:Oracle9版本及以上对应的类,OracleDialec是Oracle9以下版本对应的类show_sql:true|false是否将SQL语句打印到控制台fomat_sql:true|false让显示的sql更好看3) 映射文件xxx.hbm.xml4) Hibernate Core APIl Configuration作用:读取配置文件l Sessionn 作用:提供了一套通用的CRUD方法n Session内部封装了一个Connection对象n Transactionu 作用:专门控制事务注意:所有Hibernate程序必须要控制事务n Queryu 作用:专门进行查询的l SessionFactoryn 作用:创建Session3. Hibernate开发1) 开发步骤1、O创建操作对象entity.User.java2、R创建数据对应的表t_user表3、M创建映射文件User.hbm.xml 自动增长主键 知识点:1. 最好用Java的类型2. 自动增长主键实现策略是取出id的最大值,之后做插入操作4、映射文件注册hibernate.cfg.xml中进行xxx.hbm.xml注册5、Hibernate通用API开发Test.java/1 创建User对象 User u = new User();/2 Hibernate通过API进行开发 /2.1读取配置文件 Configuraction cfg = new Configuraction(); cfg.configure(); /2.2 获得SessionFactory对象 SessionFactory sf = cfg.buildSessionFactory(); /2.3 创建Session Session session = sf.openSession(); /2.4 调用session方法处理 Transaction tx = session.getTransaction(); tx.begin(); session.save(u); mit();2) 更新|删除1 先从数据空中把需要操作的对象查询出来User u = (User)session.get(User.class , 1); /get()方式只能通过主键查找Transaction tx = session.getTransaction();tx.begin();session.upate(u);/session.delete(u);mit();3) 封装创建Session的代码SessionFactoryl SessionFacory的作用创建Session二级缓存(second level cache)l SessionFactory是一个重量级资源功能非常强大-占用内存更多只创建一个对象,允许多线程访问(线程安全的)Sessionl 提供增删改查方法save()get()update()delete()l 内部封装了Connectionl Session是一个轻量级资源(不能被多用户共享)4) HibernateUtilHibernateUtil.javapackage util;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibUtil private static SessionFactory sf; /ThreadLocal类的作用:将Object存放到Thread类的Map中private static ThreadLocal tl = new ThreadLocal();statictry Configuration cfg = new Configuration();cfg.configure();sf = cfg.buildSessionFactory(); catch (HibernateException e) e.printStackTrace();/用户第一次调用Session时,创建Session并把Session出入线程/用户第二次调用Session时(DAO中),从Thread中获得已存在的Sessionpublic static Session getCurrentSession()/* 第一次Session session = sf.openSession();tl.set(session);return session;*/*第二次t1.get();return session;*/Session session= tl.get();if(session=null)session = sf.openSession();tl.set(session);return session;return session;public static Session openSession()return sf.openSession();5) 案例:注册注意:1. 事务处理一定写在业务层(在UserBiz.java里写)2. 要将业务层创建的Session传入到DAO中使用day024. Hibernate处理关系对象1) 步骤第1步:对象ObjectAccount Person |-No |-name |-Money |-age |-Person |-Account第2步:表Relationship t_user 父表 id name age 1 suns 30 2 liyi 31 t_order 子表 id order_no price address u_id (外键) 1 1101 10.8 shangdi 1 2 1102 10.9 dazhongsi 1 select * from t_user ,t_order where t_user.id = t_order.u_id where id = 1;知识点:1. 表使用外键表达数据关系2. 没有外键的是父表;有外键是子表第3步:映射MappingUser Order id id name orderNo age price Set UserUser.hbm.xml 关系属性 1 属性名字 name= 2 关系属性保存在那张表 class= session.save(User)-Order 3 外键 column= session.get(User)-Order 4 级联 cascade cascade=all Order.hbm.xml 关系属性 1 关系属性的名字 2 关系属性存储在那张表 session.save(Order) - User 3 外键 session.get(Order)-User 4 级联 第4步:注册hibernate.cfg.xml第5步:Hibernate API操作知识点:传递性持久化Account Person |-No |-name |-Money |-age |-Person |-Account l session.save(Person); 自动把 Account保存l session.get(Person.class)自动得到Account 2) Hibernate关联关系映射*a. 一对一关联one-to-one1. 对象ObjectPerson.javaprivate Integer id;private String name;private int age;private Date birthday; private Passport passport;Passport.javaprivate Integer id;private String serial;private int expire;private Person person;2. 关系Relationshipt_personid name agebirthday1sun1219992liyi232000t_passportidserialexprire共享主键:id既为t_passport的主键,也是t_person的外键12010201 222010202 4知识点:1. 共享主键的建表方式专门处理1:1关系映射2. 使用共享主键方式建表说明两张表的关系紧密程度很高init.sqlcreate table t_person( t_id integer primary key, t_name varchar2(12), t_age integer, t_birthday date);create table t_passport( t_id integer primary key references t_person(t_id), t_serial varchar2(12), t_expire integer);3. 映射文件MappingPerson.hbm.xml 知识点:1. one-to-one标签默认的是共享主键建表方式(本表外键为另一张表的主键)2. cascade=all表示session.save(person)时,passport也自动保存session.update(person)时,passport也自动更新session.delete(person)时,passport也自动删除Passport.hbm.xml person 知识点:1. t_passport表的主键由t_person决定Passport的id由Passport类的关系属性private Person person决定2. person关系属性:person3. constrained=true 表示是孩子表4. 注册5. Hibernate API操作l 如果想保存Person时:sesson.save(person);先插入insert person再插入 insert passprotl 如果想保存Passport时:sesson.save(passport)先插入insert person再插入 insert passport注意:永远是先插入父表数据,再插入子表数据;删除时永远先删除子表数据,再删除父表数据TestO2OPk.javapublic static void main(String args) Session session = null; Transaction tx = null; try session = HibernateUtil.getCurrentSession(); /* tx = session.getTransaction(); tx.begin(); Person p = createPerson(); session.save(p); mit(); */ tx = session.getTransaction(); tx.begin(); Person p = (Person)session.get(Person.class, 1); System.out.println(person name is +p.getName(); Passport pp = p.getPassport(); System.out.println(passport expire is +pp.getExpire(); session.delete(p); mit(); catch(Exception e) e.printStackTrace(); if(tx!=null)tx.rollback(); finally if(session!=null)session.close(); private static Person createPerson() Person p = new Person(); p.setName(suns); p.setAge(12); p.setBirthday(new Date(); Passport pp = new Passport(); pp.setSerial(2201); pp.setExpire(2); p.setPassport(pp); pp.setPerson(p); return p; b. 唯一外键one-to-one建表时独立建立了外键列,并且将外键设置为unique(唯一外键)OCompanyAddressAddress addrCompanycomRt_companyidnamedate1tarena20022yeepay2003t_addressidcitystreetzip_code1bjdzs1000982bjjingg100021OCompany.javaprivate Integer id;private String name;private Date openDate;private Address a;Address.javaprivate Integer id;private String city;private String street;private String zipCode;private Company c;Rt_companyt_id integer primary key,t_addressc_id integer references t_company(t_id)init.sqlcreate table t_company( t_id integer primary key, t_name varchar2(12), t_open_date date);create table t_address( t_id integer primary key, t_city varchar2(12), t_street varchar2(12), t_zip_code varchar2(12), c_id integer references t_company(t_id);Mcompany.hbm.xmlproperty-ref=com:参考address对于关系属性com的配置,间接获得外键address.hbm.xmlunique:唯一性约束o2ouq.hbm.xml 级联操作l cascade=all一起save()update()delete()l cascade=save-update一起save() update()但是不一起delete()当我们删除Company时,不希望删除Address;则:Company.hbm.xml注意:当指定为save-update时,在对象中解除关系,才可以在表中去除约束(删除操作) 小技巧在Object中提供工具方法/添加关系方法public void addAddress(Address address) this.a = address; address.setC(this);/解除关系方法public void removeAddress() this.a = null; address.setC(null);两个方法成对出现,写在Address或者Company中都可以 删除t_company中的一条数据以及t_addrss中的约束先在内存中解除关系company.removeAddress(c.getAddress();再删除session.delete(c);c. 一对多关联many-to-one【参看:web_day19_pm_02_110608.zip】TestO2M.j
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年社区服务与管理专业能力测试试题及答案
- 2025年人性与社会关系的哲学思考考试试题及答案
- 2025年经济发展与区域规划考试试题及答案
- 2025年工程物理实验综合测试试卷及答案
- 2025年甘肃省武威市古浪县民权镇招聘大学生村文书笔试参考题库及答案详解1套
- 2025年甘肃省平凉市灵台县新开乡招聘大学生村文书笔试参考题库及完整答案详解1套
- 2025年中国邮政集团有限公司福建省分公司校园招聘笔试备考试题及参考答案详解一套
- 物资采购常用管理制度
- 特殊儿童管理管理制度
- 特殊消防日常管理制度
- 2025年上海市研发公共服务平台管理中心招聘题库带答案分析
- 2025年新高考1卷(新课标Ⅰ卷)语文试卷(含答案)
- 红星照耀中国1-6章练习汇编(含答案)
- 债权登记申报表
- DB15T 2763-2022一般工业固体废物用于矿山采坑回填和生态恢复技术规范
- 产能验证分析报告
- Unit2Thestoneintheroad读写课件-高中英语人教版必修第三册
- 绕圆柱无环量流动和有环量流动流线分布图
- DB32∕T 2914-2016 危险场所电气防爆安全检测作业规范
- 中国海洋大学论文封面模板
- HY∕T 122-2009 海洋倾倒区选划技术导则
评论
0/150
提交评论