Hibernate单一实体映射

Hibernate单一实体映射

ID:37914943

大小:375.00 KB

页数:7页

时间:2019-06-02

上传者:U-2437
Hibernate单一实体映射_第1页
Hibernate单一实体映射_第2页
Hibernate单一实体映射_第3页
Hibernate单一实体映射_第4页
Hibernate单一实体映射_第5页
资源描述:

《Hibernate单一实体映射》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

映射&状态管理重点hibernate:对象和关系转化的API对象转数据库,数据库转对象对象持久化:将内存中的对象状态存在的数据转存到外部持久设备上.并且适当的时候可以将持久设备(硬盘光盘等)中的数据恢复到内存对象状态的数据.为什么用对象持久化?物理原因:1.内存不能持久化2.内存容量有限业务原因:3.信息共享(流动)4.管理(安全,有效,可以设置权限)5.大规模检索所以对象持久化是必须的怎样实施对象持久化?1.对象序列化,实现Serializable接口(针对个别对象,结果是本地二进制文件,需要恢复后才能读取,不能检索,不适合存取序列化海量数据,只能在物理上有作用,用于少量的短时间的)2.放数据库中(物理业务都可以)所以企业级对象持久化使用数据库.怎样使用数据库进行对象持久化?历史发展过程:1.JDBC优点:1.功能完备,最底层的(都是基于这个接口)2.理论上效率最高3.接口粒度细缺点:1.代码量大2.开发难度大(关联太多,开发会的人少)2.EJB的实体bean2.X优点:封装了JDBC缺点:采取了重量级的解决方案,捆绑销售(1.成本高2.维护工作量大3.在EJB中实体最弱4.API更复杂5.依赖服务器,所以不能在服务器之外进行测试)3.轻量级的ORM框架(hibernate)轻量级:不需要服务器,作为一个单一功能的类库优点:1.专业2.不需要依赖服务器,测试调试方便3.由于只是一个类库,功能是可以修改的4.拥有成本低5.封装了JDBC,提供了简单的API缺点:功能完备性低(批量更新方面)Hibernate工作原理:封装JDBC,完成对象持久化见图 开发步骤:0.开发环境1.先设计持久类2.映射文件3.schema数据库表结构4.应用程序其他部分测试类Test(hibernateAPI)持久类:1.要有一个唯一标识符oid,要存储到数据库,对应要有主键.而且还要是中性的(增删改查都需要主键,各个主键怎么产生不统一,所以要用hibernate产生一个oid,作为表主键,负责维护)2.空的构造方法要用x=newx();x.setm();来使用,不能使用有参3.使用set/get方法hibernateAPI:session的save()/delete()/update()/create()环境1.类库导入Eclipse工程中a.类库***导入hibernate库文件***1、在eclipse中建立一个java工程,如:hbn2、在工程hbn的属性--BuildPath中选择AddLibraries3、在AddLibraries窗口中选择UserLibrary点next按钮4、在UserLibrary窗口中点UserLibraries...按钮5、在UserLibraries窗口中,点new按钮6、在Newuserlibrary窗口中,填写一个Userlibaryname(如:hbnlib,注意不要选择Systemlibary复选框),点OK按钮回到UserLiberies窗口7、在UserLiberaries窗口中选择刚刚创建的hbnlib,点Addjars按钮8、在打开的文件选择窗口中找到解压好的hibernate的库文件,全部选中,点"打开"按钮,返回UserLibraries窗口9、在UserLibraries窗口中点OK按钮,返回UserLibrary窗口;再点Finish按钮,结束操作2.xml映射(类表)配置(DB连接信息)映射文件编码规范XXX.hbm.xmla.一个映射文件映射一个持久类(类对应表属性对应字段)b.映射文件名称与持久类名称保持一致AccountAccount.hbm.xmlc.映射文件与其映射的持久类放在同一个包路径中 主键oid的生成采用高低位算法,高位由私有计数器生成,低位由共有计数器生成publicclassTestacc{publicstaticvoidmain(String[]args){Accountacc=newAccount("zxm316733855",1000.0);//Configurationcfg=newConfiguration();//cfg.configure();//读配置文件,相当于加载驱动//没有返回值为void的,可以返回调用对象的引用this,相当于..Configurationcfg=newConfiguration().configure();SessionFactorysf=cfg.buildSessionFactory();//取出session工厂//SeesionFactory是重量级对象,并且是线程安全的,可以多线程//一个应用程序一个SessionFactory就可以,应用程序结束要关闭Sessions=sf.openSession();//造出session//session是一个轻量级对象,但是线程不安全//一个线程一个session,一个session一个事务,事务结束,关闭sessionTransactiontran=null;try{tran=s.beginTransaction();//事务开始s.save(acc);//将帐户对象持久化//s.getTransaction().commit();//提交tran.commit();}catch(Exceptione){e.printStackTrace();tran.rollback();//回滚(非捕获异常,有用就自己捕捉try/catch)}finally{s.close();sf.close();}}}主键名方法 没有序列时要创建一个序列createsequence….. hiloseqhilosequenceassignednativeuuid全球唯一标识算法比较特殊,也不用计数器,用运行机器的IP地址和系统时间,算出一个特殊的128的id,再变成32位的十六进制,然后以字符串的形式存储,因此这个的话OID要用String而不是用Long类型,这种对数据库没压力,不过有点浪费空间修改方式Hibernate类型实体(独立映射的持久类)和值(基本类型/集合/组件/不变对象(String和日期))java类型和jdbc类型映射,jdbc(sql标准类型)和db(sql非标准类型)类型映射(hibernate完成需要知道java类型)Stringvarcharvarchar2是映射类型注意是小写,代表{String,varchar}表示java类型对应哪种sql标准类型持久对象状态(一组属性值color=red)Transient暂态(持久对象在数据库中没有记录,和当前任何session无关,session缓存里没有东西)Persistent持久态有记录与session有关,自动同步(session自动update)Detached游离态数据库中有记录和session无关(需要手动update) 关于delete()是将数据库中对应的删除,并且删除session缓存中的,但是这个对象还是存在的,关于saveorupdate会自动判断oid是否为空只要oid为null,或者没有找到证明没有存过,就会用save,如果存在就为updatesaveorupdate()是安全函数,不确定是游离态还是暂态时用load(类型,oid)根据oid从数据库中读出来恢复对象,先到session缓存里面查找,如果存在会返回查询对象引用,没有会创建一个代理对象并且返回代理对象的引用,然后当使用时如果是一个代理对象,就要去查询数据库如果查到,就执行正常操作,如果没有就会抛异常get(类型,oid)根据oid从数据库中读出来恢复对象,先查询缓存,如果存在返回一个引用,如果没有则查询数据库,有的话返回一个引用,没有返回一个空null有时候get也会产生异常,如果load在get前产生一个代理对象就会被get对象自动引用,所以两个产生的对象时同一个,当数据库中没有时就会抛异常//用load查类型时还没有去数据库,只有用代理的时候才会去数据库,get会去数据库查批量更新commit的时候会扫描缓存,提交之前不会进行任何数据库操作,要数据库进行操作用session.flush立刻刷新缓存1.提交之前会有一个隐式的flush2.查询的时候涉及到缓存里的数据,就会自动被flush一下3.主动调用flush()方法 HQL:与SQL语法相似,但是HQL是面向对象的,SQL是面向过程的publicstaticvoidmain(String[]args){Sessions=HbnUtil.getSession();try{s.beginTransaction();Stringhql="fromAccount";//from后面跟类的名字,表示要所有账户类的实例,具体怎么找交给hibernate//Queryq=s.createQuery(hql);//Listaccts=q.list();Listaccts=s.createQuery(hql).list();//所有账户类的集合,等价于上面StringBuffersb=newStringBuffer();for(Accountacct:accts){sb.append(acct.getOid()+"=");sb.append(acct.getBal()+" ");}System.out.println(sb.toString());s.getTransaction();}catch(HibernateExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{s.close();HbnUtil.closeSessionFactory();}}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭