




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JPA下的Hibernate实现一对多级联删除5Hibernate级联问题9级联问题:11hibernate级联删除 问题之inverse配置13hibernate 级联删除15Hibernate的组成 1. SessionFactory:完整包名:org.hibernate.SessionFactory,用业创建Session类的实例。SessionFactory是线程安全的,可以被多个线程并发调用,因此在实际应用中针对一个数据库只创建一个该类的实例即可2. Session:完整包名:org.hibernate.Session,用来操作数据库的各种方法,如sava,delete,update,createQuery等。Session是非线程安全的,每执行一个数据库事务,应创建一个Session实际。3. Transaction:完整包:org.hibernate.Transaction,用来管理与数据库交互过程中的事务。4. ConnectionProvider:完整包:org.hibernate.connection.ConnectionProvider用于连接JDBC。5. TransationFactory:完整包:org.hibernate.TransactionFactory,用来创建Transation实例的工厂。它可以用来选择事务类型,其中包括Hibernate可以处理的3种事务类型:JDBC、JTA和JNDI。6. Xml格式的配置文件:hibernate.cfg.xml,开发时放在src下,发布后位于WEB-INF/classes目录下。主要内容:a) show_sql: 是否输出 SQL语句b) connection.username:连接数据库的用户名c) connection.password:连接数据库的密码d) connection.url:连接数据库的URl。e) Dealect:使用的连接数据库的方言,默认为org.hibernate.dialect.SQLServerDialect,即SQL Server数据库方言。f) Connection.driver_class:用于驱动数据库的工具类。例如,java中驱动SQLServer的工具类为com.microsoft.jdbc.sqlserver.SQLServerDriver.7. Configuration:用于初始化Hibernate,创建SessionFactory实例。在程序中,通过如下代码创建Configuration类对象:Configuration config=new Configuration();在实例化过程中,config对象会首先读取perties文件,如果没有该属性文件,那么会加载hibernate.cfg.xml配置文件,并通过configur()方法来读取配置文件。8. SessionFactory通过Configuration类中方法创建,它用来初始化Session类(Hibernate交互数据库的工具类)。当创建了Configuration类的对象后,就可以通过该类中的方法来创建SessionFactory类了。应用Hibernate必须创建SessionFactory类。创建SessionFactory对象的代码如下:SessionFactory session = cfg.buildSessionFactory();9. Session:Hibernate的动作 核心就是Session类,它负责管理对象的生命周期、事件处理、数据交互等。Session类的创建代码如下:Session session = sessionFactory.openSession();Session类用来与数据库交互的常用方法包括:a) Save():保存数据。该方法可以将数据存储到指定数据表当中b) createQuery():通过查询语句字符串来完成数据的查询操作,可以全部查询也可以有条件的查询。c) Load():根据OID(对象标识)来加载数据库中指定的数据。d) Update():根据load()方法加载的数据与当前的数据比较,来更新数据表中的数据。e) Delete():根据OID删除数据表中一条数据。f) beginTransaction():获取事务管理对象。10. Hibernate针对一对一的关联提供两个映射方法:a) 按照主键映射:要求两个数据表以主键相关联,即其中一个表的ID字段既是主键又是外键,两个表共享主键。b) 外键映射:这种方式要求一个表中的主键关联另一个表中外键,即一个表中的外键参照另一个表的主键。11. Hibernate针对一对多的关联关系提供了以下映射方法:a) 单向关联:在实体类中,将一的一方(如客户)定义为多的一方(如订单)的一个属性,在多的一方的映射文件中使用元素。b) 双向关联:在实体类中,将一的一方(如客户)定义为多的一方(如订单)的一个属性,同时在一的一方定义一个集合型(Set类型)的属性。在多的一方的映射文件中使用元素,在一的一方的映射文件中使用元素及其子元素12. Hibernate针对多对多的关联提供以下映射方法:a) 单向关联:在实体类中,其中任意一方定义一个集合类型(Set类型)的属性,并在其映射文件中使用元素及其子元素.b) 双向关联:在实体类中,双方均定义一个集合类型(Set类型)的属性,并在各自的映射文件中使用元素及其子元素.13. Hibernate工作步骤:a) 读取并解析配置文件:这是使用Hibernate框架的入口,由Configue类创建b) 读取并解析映射信息:调用Configue中的buildSessionFactory()方法来实现,同时创建SessionFactory。c) 开启Session:调用sessionFactory的openSession()方法来实现。d) 创建事务管理对象Transaction:调用Session对象的beginTransaction()来实现。e) 数据交互操作:调用Session对象的各种操纵数据库的方法来处理数据,如增、删、查、改操作。f) 提交事务:完成了对数据库的操作后应该提交事务,完成一次事务处理。、g) 关闭Session:结束了对数据库的访问以后,应该立即关闭Session对象,释放其占用的内存。h) 关闭SessionFactory:完成了全部的数据库操作后关闭SessionFactory对象。1、 对于一个简单的hibernate中所依持的jar。2、 这里需要八个jar 1、在hibernate-distribution-3.6.8.Final下找到 hibernate3.jar 2、在hibernate-distribution-3.6.8.Finallibrequired 全部的jar 3、在hibernate-distribution-3.6.8.Finallibjpa 的 hibernate-jpa-2.0-api-1.0.1.Final.jar这个jar是sun公司提供的,对于hibernate中通过注解来完成javaBean影射表的依赖包,通过它hibernate加强了通过注解 来完成javaBean影射表连接数据库的驱动包 例:mysql-connector-java-5.1.17-bin.jar【在hibernate-distribution-3.6.8.Finalprojectetc 中有对于配置的模板】二、对于使用日志的hibernate 要在以上基础上增加两个jar 【这里需要注意 slf4j-log4j12-1.6.4.jar的版本 必须 要高于 slf4j-api-1.6.1.jar 】 1、在slf4j-1.6.4中的 slf4j-log4j12-1.6.4.jar这个jar不是hibernate的 而是slf4j-1.6.4的 2、在apache-log4j-1.2.16.zip 下的log4j-1.2.16.jar这个jar不是hibernate的 而是apache的log4j需要一个配置文件即classpath:perties.为什么要使用log4j - 为了更加详细的看到hibernate的启动过程 在hibernate-distribution-3.6.8.Finallibrequired 中有这样一个slf4j-api-1.6.1.jar 它不是日志包。它是一个中间的日志转换器 日志相关jar: commons-logging log4j jboss-logging【1、对于log4j所需要的perties详细注释】=#定义日志文件的输出级别和目标#级别:一般是五个 (on全部输出) debug, info, warn, error, Fatal, off(关闭)#三大组件:logger(日志),appender(目标),layout(格式)#stdout输入目标到控制台,file输入目标到本地log4j.rootLogger=debug,stdout,file#org.apache.log4j.ConsoleAppender 指定是控制台输出#System.out 指定是system.out打印语句, 也可以是system.err#log4j.appender.stdout.Target=System.out#org.apache.log4j.PatternLayout 指定格式#%dyyyy-MM-dd HH:mm:ss:SSS %5p %c:%L - %m%n 指定具体的输出格式#%d-日期格式 SSS毫秒 %p级别 %5p格式调整为五位 %c=class(类名) %L=line(行号) %m=message(信息) %n=/n(换行)log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss:SSS %5p %c:%L - %m%n#org.apache.log4j.FileAppender 指定是输出到本地文件#d:/logs/root.log 指定输出到本地的具体位置#log4j.appender.file.MaxFileSize=64KB 指定日志文件的最大值#log4j.appender.file.MaxBackupIndex=3 指定日志文件备份多少个#org.apache.log4j.PatternLayout 指定格式#%dyyyy-MM-dd HH:mm:ss:SSS %5p %c:%L - %m%n 指定具体格式#%d - date %p-proritiy (级别) %c = class %L= line %m=message %=/n#%dyyyy-MM-dd HH:mm:ss:SSS %5p %c:%L - %m%n 指定具体的输出格式#%d-日期格式 SSS毫秒 %p级别 %5p格式调整为五位 %c=class(类名) %L=line(行号) %m=message(信息) %n=/n(换行)log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=d:/logs/root.loglog4j.appender.file.MaxFileSize=64KBlog4j.appender.file.MaxBackupIndex=3log4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss:SSS %5p %c:%L - %m%n=【2、对于log4j所需要的perties的不带注释的】log4j.rootLogger=INFO,sd,filelog4j.appender.sd=org.apache.log4j.ConsoleAppenderlog4j.appender.sd.layout=org.apache.log4j.PatternLayoutlog4j.appender.sd.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss:SSS %5p %c%L - %m%nlog4j.appender.file=org.apache.log4j.RollingFileAppenderlog4j.appender.file.File=d:/logs/root.loglog4j.appender.file.MaxFileSize=64KBlog4j.appender.file.MaxBackupIndex=3log4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss:SSS %5p %c%L - %m%n=三、对于hibernate使用c3p0连接池对于一次创建多少连接的问题: 一般是三分之一原则 :例如有1000人访问 要创建多少连接 300 最好说是130到200之间 因为这样就代表你了解这个当说130到200后你还要说这个要通过优化代码来实现就是当用完这个连接后一定要立刻返回到连接池也就是让连接交互使用 这里需要一个jar 在hibernate-distribution-3.6.8.Finalliboptionalc3p0 下的 c3p0-0.9.1.jar 【1、hibernate对于c3p0的配置 在perties中】 =# C3P0 Connection Pool#hibernate.c3p0.max_size 2 最大连接数#hibernate.c3p0.min_size 2 初始值#hibernate.c3p0.timeout 5000 连接超时时间 5秒#hibernate.c3p0.max_statements 100 每次批处理的最大数量#hibernate.c3p0.idle_test_period 3000 最大空闲时间 3秒#hibernate.c3p0.acquire_increment 2 当连接不足时,一次创建多少个#hibernate.c3p0.validate false 验证 =【2、hibernate对于c3p0的配置 在hibernate.cfg.xml中】 4200022 =四、hibernate使用二级缓存 需要第三方包 ehcache-2.4.4-distribution - ehcache-2.4.4lib - ehcache-core-2.4.4.jar 加入到classpath中。还有一个日志包,当在二中配置了日志包后,就不需要再配置了 这里还要将ehcache.xml文件放到classpath根目录下。ehcache.xml文件的配置= =Hibernate实现级联删除(一)我的使用背景:v 有新闻和新闻类型,一条新闻只能属于一个类型,一种新闻类型可以对应多条新闻。v 在数据库中,新闻受新闻类型外键约束,并可以级联删除v 在 Hibernate 中,实现级联删除 (一) 创建数据库表和关系DROP TABLE NewsType;CREATE TABLE NewsType( TypeID NUMBER(10) PRIMARY KEY NOT NULL, TypeName VARCHAR2(400) NOT NULL, DirName VARCHAR2(400) NOT NULL, TemplateName VARCHAR2(400) NOT NULL);DROP SEQUENCE NEWSTYPE_SEQ;CREATE SEQUENCE NEWSTYPE_SEQ INCREMENT BY 1 START WITH 1; DROP TABLE News;CREATE TABLE News( NewsID NUMBER(10) PRIMARY KEY NOT NULL, TypeID NUMBER(10) NOT NULL, Title VARCHAR2(400) NOT NULL, HitCount NUMBER(10) DEFAULT 0 NOT NULL, IssuseDate DATE NOT NULL, DeployerID NUMBER(10) NOT NULL, Origin VARCHAR2(400) NOT NULL, URL VARCHAR2(400) NOT NULL, KEYWORDS VARCHAR(400) , Priority NUMBER(10) DEFAULT 0 NOT NULL, Special VARCHAR2(400) , Description VARCHAR2(400), Author VARCHAR2(400), Topic VARCHAR2(400);DROP SEQUENCE NEWS_SEQ;CREATE SEQUENCE NEWS_SEQ INCREMENT BY 1 START WITH 1; 在 oralce 中,设置数据表的约束关系如下图: (二) 实现数据表到 POJO 的映射映射类,我们略去,此处主要显示配置文件 News.hbm.xml NEWS_SEQ Newstype.hbm.xml 其实这是个双向以对多关系。 (三) 在 DAO 中实现级联删除 / 删除新闻类型记录 dao.getNewsTypeDAO().deleteObjects(typeIDs);typeID 是新闻类型的主键执行此操作将会删除所有此新闻类型的新闻。news 是一个 Set 类型的变量,用来存放此类型的所有的新闻。(四) 删除时遇到的问题在数据库中,如果设置了约束关系,那么一定要允许级联删除,否则,你在执行删除时会抛出异常。如果我们的数据库关系设置如下: 画圈的那个选项没有选上的话 ,那么我们在执行的时候就会抛出如下的异常:006-04-06 13:20:16 ERROR http-8080-Processor23 (JDBCExceptionReporter.java:72 - ORA-02292: 违反完整约束条件 (SC.NEWS_TYPE_RELATIONS) - 已找到子记录日志 rg.hibernate.exception.ConstraintViolationException: could not execute update qery at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.jva:69) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelpr.java:43) at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:8) 问题的关键在如下两点:1. 数据库中要允许数据表的级联删除2. 在映射文件中要将级联删除配置正确 JPA下的Hibernate实现一对多级联删除再谈Hibernate级联删除JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN声明:1、本文系原创,非抄袭或转载过来的。2、本文论点都亲手做过实验论证。3、本文所讲的Hibernate配置都基于注解的方式,hbm语法未提供。很多人对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和 Hibernate是具体的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session Bean近似)。理论是使用JPA接口可以无缝切换持久层实现,但是仅仅是理论上!JPA是在Hibernate成熟并大行其道的时候才推出的,基本上是借鉴Hibernate的优点,做了一个统一的标准而已,JPA1.0没有一对多的级联删除配置,也许JPA2.0里才有吧(这里没做过调研)OneToMany(mappedBy = commentTeam)Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE,org.hibernate.annotations.CascadeType.DELETE_ORPHAN)private Set commentTeamMembers;这里为了说明,只贴出一对多的关键代码,其它无关的注解已忽略掉,以免造成干扰。这里重点说明一下四个常用的注解配置的区别:CascadeType.SAVE_UPDATECascadeType.ALLCascadeType.DELETECascadeType.DELETE_ORPHAN 之所有之列出这四个,是因为我不想跟书本上把所有的概念都罗列出来。基本上开发时其中的3个都以及足够用了,下面我结合代码演示一下他们之间的区别,以及使用的时候注意的地方。CascadeType.SAVE_UPDATE:Hibernate专有的,JPA并不支持,作用是级联保存、级联更新(注:JPA很恶心,要么你配置CascadeType.ALL,要么你配CascadeType.SAVE+CasadeType.Merge。八卦一句:专家虽牛,多年不写代码,定的标准让编码麻烦呀!)CascadeType.ALL:级联保存、修改、删除、同步,一般很少用,看看控制台的一长串SQL就知道性能低下,你没改的关联表也给你发update语句,我从来没用过这个属性。CascadeType.DELETE:当调用session.delete(A)的时候,级联删除关联的对象。(注:先调用A.setB(null),再调用session.delete(A),这样是级联删不掉B的。CascadeType.DELETE_ORPHAN:一对多级联删除。下面重点来说说这个CascadeType.DELETE_ORPHAN:看过API、开发指南,级联删除就一个经典的OneToMany(mappedBy = commentTeam)Cascade(CascadeType.SAVE_UPDATE,CascadeType.DELETE_ORPHAN)private Set commentTeamMembers;mappedBy不可少,映射A-B一对多的另一边控制反转(谁控谁的问题),新版的Hibernate3.4中配置更简单,变一句了,更简洁吧?OneToMany(mappedBy = commentTeam,orphanRemoval=true) private Set commentTeamMembers;以上两种配置方式是等价的,下面是在实际开发中的使用了,有些时候代码方面不注意,会误以为明明配置正确了,但为什么不起作用呢? 下面例举一下代码,请看Action代码(实际上我在Spring Controller里,N年不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省嘉兴市嘉善高级中学2026届高二化学第一学期期中考试试题含解析
- 2026届湖北省随州市第二高级中学、郧阳中学化学高二第一学期期末统考模拟试题含答案
- 桡骨中段骨折护理查房课件
- 2025年能源资源管理与可持续发展试卷及答案
- 2025年注册验船师资格考试(C级船舶检验专业基础安全)综合能力测试题及答案二
- 2025年注册验船师资格考试(A级船舶检验法律法规)综合能力测试题及答案一
- 2025年钢琴学习教程与曲目练习指南
- 2025年企业运营管理能力提升课程试题集及解析
- 2025年9月遗传生殖门诊护理理论考试题及答案
- 北京市门头沟区2023-2024学年七年级上学期期末质量监测数学考试题目及答案
- 分镜头脚本设计-课件
- 2020数学花园探秘决赛三四年级A卷
- 冀教版四年级数学下册小数进位加法说课稿
- (精选word)2019《普速铁路线路修理规则》
- 《信念永恒》(朗诵稿)
- 开具生效证明申请书(申请开具生效证明用)
- 瑞吉欧活动-人群课件
- 大学生生命教育与心理危机应对
- 四年级语文上册第一单元【教材分析】课件
- 物流公司财务管理制度
- 卫生监督执法约谈通知书
评论
0/150
提交评论