![马士兵笔记分类hibernate09人阅读评论13收藏举报_第1页](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee11.gif)
![马士兵笔记分类hibernate09人阅读评论13收藏举报_第2页](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee12.gif)
![马士兵笔记分类hibernate09人阅读评论13收藏举报_第3页](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee13.gif)
![马士兵笔记分类hibernate09人阅读评论13收藏举报_第4页](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee14.gif)
![马士兵笔记分类hibernate09人阅读评论13收藏举报_第5页](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee15.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernateannotation笔记马士分类:hibernate2011-11-1809:5914997(13)收藏hibernatesessionstring12HibernateUML345第6课第一个示例HibernateoWorld7第7课建立Annotation版本的World9第8课什么是O/RMap11一 定义:.二 Hibernate的创始人:.三 Hibernate做什么:.四 Hibernate存在的原因:.五 Hibernate的优缺点:.六 Hibernate使用范围:.9Hibernate:Hibernate一、对象---关系映射模式.O/R10Hibernate(OR一 项目名称.二 原代码.11Hibernate一 提纲.二、MYSQL三、Hibernate.cfg.xml:hbm2ddl.auto16四、DDL16五、Junit16 ehibernate.cfg.xml:show_sql17 hibernate.cfg.xml:format_sql17 表名和类名不同,对表名进行配置.17九 字段名和属性相同.十、字段名和属性名不同.十一 不需要(持久化)psersistence的字段.十二 映射日期与时间类型,指定时间精度.十三 映射枚举类型.12hibernate13ID一、Xml<generator>20二、annotateon211、AUTO212、IDENTITY3、SEQUENCE4OracleSequence5、TABLEid三 联合主键.1、xml2、annotation第14课Hibernate开发接口(重点)一 Configuration(AnnotationConfiguration)二 SessionFactory三 Session1 管理一个数据库的任务单元.2 save();3 delete()4 load()5 Get()6 load()与get()区别.7 update()8 saveOrUpdate()9 clear()10 flush()11 evict()15一 瞬时对象(TransientObject):.二 持久化对象(PersistentObject):.三 离线对象(DetachedObject):.四 三种状态的区分:.五 总结:.16一 一对一关联映射. lism)37 唯一外键关联-双向.40(三 主键关联-单向(不重要)(四 主键关联-双向(不重要)(五 联合主键关联(Annotation方式)二 component(组件)关联映射.(一 Component关联映射:.(二 User实体类:.(三 Contact值对象:. xml--User映射文件(组件映射):.46 annotateon注解.46(六 导出数据库输出SQL语句:.(七 数据表结构:.(八 组件映射数据保存:.三 多对一–单向.(一 对象模型图:.(二 关系模型:.(三 关联映射的本质:.(四 实体类.(五 xml方式:映射文件:.(六 annotation 多对一(先group(对象持久化状态后,再保存user)):.50(八 重要属性-cascade(级联):.(九 多对 加载数据.四 一对多-单向.(一 对象模型:.(二 关系模型:.(三 多对一、一对多的区别:.(四 实体类.(五 xml方式:映射.(六 annotateon注解. 导出至数据库(hbmàddl)生成的SQL语句:.53 一对多单向实例:.53(九 生成的SQL语句:. 一对多,在一的一端关系的缺点:.54 一对多单向数据加载:.54(十二 加载生成SQL语句:.五 一对多-双向.(一 xml方式:映射.(二 annotateon方式注解.(三 数据保存:.(四 关于inverse属性:.(五 Inverse和cascade区别:.(六 一对多双向关联映射总结:.六 多对多-单向.(一 实例场景:.(二 对象模型:.(三 关系模型:.(四 实体类.(五 xml方式:映射.(六 annotation注解方式.(七 生成SQL语句.(八)数据库表及结构:.(九)多对多关联映射单向数据:.59(十)61七、多对多-双向.61(一)xml(二)annotation八 关联关系中的CRUD_Cascade_Fetch九、集合映射.十、继承关联映射.(一 继承关联映射的分类:.(二)对象模型:.(三 单表继承SINGLE_TABLE:.(四 具体表继承JOINED:.(五 类表继承TABLE_PER_CLASS(六 三种继承关联映射的区别:.17hibernate一 节点实体类:.二 xml方式:映射文件:.三 annotation注解.四 测试代码:.五 相应的类代码:.18一 设计.二 代码:.三 注意.19Hibernate(QueryLanguage)一 Hibernate可以使用的查询语言.二 实例一.三 实体一测试代码:.四 实例二. 实例二测试代码.87第20课QuerybyCriteria(QBC)89 实体代码:.89二 Restrictions用法.三 工具类Order提供设置排序方式.四 工具类Projections提供对查询结果进行统计与分组操作.五 QBC分页查询.六 QBC复合查询.七 QBC离线查询.21QueryByExample(QBE)一 实例代码.第22课Query.list与 te(不太重要)一 te查询数据.二 query.list()和 te()的区别.三 两次query.list()2324hibernate一 Session级缓存(一级缓存)二 二级缓存.1 二级缓存的配置和使用:.2 二级缓存的开启:.3 指定二级缓存产品提供商:.4 使用二级缓存.5 应用范围.6 二级缓存的管理:.7 二级缓存的交互.8 总结.三 查询缓存.四 缓存算法.25 数据库的级别:并发性作用。.104 Mysql查看数据库级别:.1042 Mysql数据库修改级别:.二 事务概念(ACID)三 事务并发时可能出现问题.26hibernate一 悲观锁.1 悲观锁的实现.2 悲观锁的适用场景:.3 实例:.4 悲观锁的使用.5 执行输出SQL语句:.二 乐观锁.1内1 Hibernate原理模拟-什么是O/RMap以及为什么要有O/RMap 常风的O/R框架4 Hibernate基础配5 Hibernate接口介6 对象的三种状7 ID生成策8 关系映9 Hibernate查询10 在Struts基础上继续完美11 性能优12 补充话2HibernateUML31 先脉络,后细2 先操作、后原3 重Annotation,轻xml配置文JPAEJB3Hibernate–41 hibernate-distribution-3.3.2.GA-hibernate-annotations-slf4j- (hibernate2 文3 hibernateannotateon5准1 hibernate3.3.22 hibernate-annotations-3.4.0 注意阅读hibernatecompatibilitymatrix slf4j1.5.86Hibernate1 建立新的java项目,名为hibernate_0100_2 学习建立User-liberary-hibernate,并加入相应的jar项目右键-buildpath-configurebuildpath-addUser-librarylibrary,命名为libraryhibernatejarSlf-3 引入mysql的JDBC驱动4 在mysql中建立对应的数据库以及CreateCreatetableStudent(idintprimarykey,namevarchar(20),ageint);5 建立hibernate配置文件6 建立Student7 建立Student映射文件8 将映射文件加入到9 写测试类Main,在Main中对Student对象进行直接的测[java]view1.public voidmain(String[] Configuration SessionFactory Sessionsession Student *org.hibernate.cfg.Configuration*hibernate配置文件(perties)的.*new Configuration()默认是*所以使用 来hibernate.cfg.xml配置文cfg= ***SessionFactorysf= trysessionweb//sessionconcation,session//sessionsession. hibernate JDBC hibernate} (HibernateException } }}1 newConfiguration().configure().buildSessionFactory(), org.hibernate.cfg.Configuration*hibernate配置文件(perties)*newConfiguration()默认是*newConfiguration().configure();来hibernate.cfg.xml注意:在hibernate里的操作都应该放在事务7Annotation本Worldhibernate3.0 创建teacher表,createtableteacher(idintprimarykey,namevarchar(20),titlevarchar(10));2 创建Teacher[java]view Teacher int String String//设置主键使用 int return void {this.id String return void{ String return void{this.title 1 在hibernatelibrary中加入annotation的jarHibernateannotationsEjb3persistencemonannotations注意文档中没有提 mon-2 参考Annotation文档建立对应的注[java]view Teacher Teacher int String String//设置主键使用 int return void this.id String return void String return void title)this.title 1 在hibernate.cfg.xml中建立映射<ma<map注意:<map>中使用的是class属性,而不是resource属性,并且使2 参考文档进[java]view void Teacher t.setTitle(" org.hibernate.cfg.AnnotationConfigurationConfiguration,Annotation Configurationcfg SessionFactorysf Sessionsession 1 后不给提解决方法:windows→Proferences→seach“ContentAssist”Auto-Activation———————————————————————————————————————————————————————————————————————————————————————————8O/R一 定义ORM(ObjectRelationalMap)---是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。简单说:ORM一 Hibernate的创人Gavin二 Hibernate做么1 就是将对象模型(实体类)的东西存入关系模型中2 实体中类对应关系型库中的一个表3 实体类中的一个属性会对应关系型数据库表中的一个4 实体类的一个实例会对应关系型数据库表中的一条记录%%将对象数据保存到数据库、将数据库数据读入到对象OOP---面向对象的开就是阻抗不匹配。Hibernate三 Hibernate存在原因1 解决阻抗不匹配的问题2 目前不存在完整的面向对象的数据库(目前都是关系型数据库3 JDBC操作数据库很繁4 SQL语句编写并不是面向对5 可以在对象和关系表之间建立关联来简化编6 O/RMap简化编7 O/RMap数据库平8 hibernate_0200_OR_Map四 Hibernate的优点 可以了,就可以能够、更新、删除、加载对象,可以提高生产效; 4、Hibernate承Hibernate中的任何类、实现任何接口,只是个纯粹的单纯对象—称为POJO对象(最纯粹的对象—这个对象没有继承第框架的任何类它的任何接5、Hibernate6 Hibernate代码测试方便五 Hibernate使用围Hibernate(O/SQL9Hibernate习Hibernate的对象关系映一、对象---关系映射模 二、常用O/R映射框架1 2 JDO(是SUN一套标准—Java数据对象 Toplink(Orocle公司的)5 EJB(2.0X中有CMP;3.0X提出了一套“Java持久化API”---6、IBatis(JDBC说不是O/R映射框架,而是基于SQL的映射(提供了一套配置文件,把SQL语句配置到文件中,再配置一个对象进去,只要配置文件时,就可得到对象))7 JAP(是SUN公司的一套标准10HibernateOR测试驱动开一项目名hibernate_0200_OR_Map二 原代[java]viewTest staticvoid args)throws Student Sessionsession SessionSession[java]viewSession Session tableName Map<String,String>cfs cfs.put("_id",cfs.put("_name",cfs.put("_age",methodNames void throwsString createSQL();//SQLConnectionconn PreparedStatementps for(int methodNames.length;Methodm=s.getClass().getMethod(methodNames[i]);//返回一个Method对象,它反映此Class对象所Classr=m.getReturnType();//返回一个Class对象,该对象描述了此Method对象所表示的方法的正式{参数都随需服从方法调用转换 returnValueps.setString(i }if(r.getName().equals("int")) returnValue + }{ returnValue ps.setString(i } +}} String String int for(String v.substring(1);// ="get" getter } - for(int str2 -String ++str1 return11Hibernate配 介绍MYSQL的图形化客户端3 4 搭建日志环境并配置显示DDL语5 搭建Junit环Junit ehibernate.cfg.xml:show_sql7 8 表名和类名不同,对表名进行配Xml:9 字段名和属性相默认为Xml10 字段名和属性名不Xml:11 不需要psersistence的字Xml:12 映射日期与时间类型,指定时间精Xml:13 映射枚举类Xml:14 字段映射的位置(field或者get方法Bestpractice:fieldget/set15 16 课外:CLOBBLOB类型的数据存17 课外:Hibernate自定义数据类18 Hibernate类MYSQL图形化客户SessionFactoryschemaDDLcreate-dropSessionFactorydropschema.取值validate|update|create|create-drop四、搭建日志环境并配置显DDL语slflog4j1 首先引入log4j的jar包(log4j- Junit1Junit类库jar(junit-2、在项目名上右键→new→SourceFolder→输入名称3、注意,你对哪个包进试,你就在测试下建立和那个包相同的[java]view 1.public TeacherTest{ staticSessionFactory =null; static sf= @Test// voidTeacher t.setTitle("Session @AfterClass//Junit static ehibernate.cfg.xmlSQLorg.hibernate.SQLlogcategorydebug。取值:true|falsehibernate.cfg.xmllogconsoleSQL取值true|falseTrue式:[java]view DEBUG table id nametitleprimary False样式[java]view16:33:40,484DEBUGSchemaExport:377-createtableTeacher(idintegernotnull,namevarchar(255),titlevarchar(255),primarykey(id))八、表名和类名不同,对表名进行配Annotation:@Table(name=”tableName[java]view Teacher Id,getXXX Teacher}[java]view name="Student"段名和属性相Annotation:默认为注意:如果在成员属性没有加入任何注解,则默认面加入了Xml段名和属性名不Annotation:使用@Column(name=”columnName”)进行注[java]view Teacher Teacher{ int String Stringtitle;//设置主键使用 int return @Column(name="_name")// String return [java]view name="name"十一、不需要(持久化)psersistence的字Annotation:使用@Transient进行注解就可以了。[java]view String return4.Xml:十二、映射日期与时间类型,指定时间精TemporalTypeTemporalType.TIMESTAMP表示yyyy-MM-dd 表示yyyy-MM- 表示[java]view Date return4.注意:当使用注解时,属性为value时,则这个属性名可以省略,例如Xml:typehibernate[java]view name="birthDate"注意:hibernate:date,time,timestamp,当然您Java十二枚举类其中EnumType有二个值:①EnumType.STRING RDINAL表示将枚举所对应的数值存入数据Xml:12hibernate对象packagecom.wjt276.hibernate;importorg.hibernate.cfg.AnnotationConfiguration;importorg.hibernate.cfg.Configuration;importHibernatehbmAnnotationCopy@author@version1.0publicclasportDBpublicstaticvoidmain(String[]/*org.hibernate.cfg.Configuration*hibernate配置文件(perties)*newConfiguration()默认是*newConfiguration().configure();来hibernate.cfg.xmlConfigurationcfg=new/*org.hibernate.tool.hbm2ddl.SchemaExport*Configuration*SchemaExportexport=/***第一个参数:scriptDDL*第二个参数:exportexport.create(true,运行刚刚建立的ExportDB类中的main()方法,进行实际的导出类13ID策Xml被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBeans风格<id> nametypeHibernatehibernatehbernate(integer,long,short,float,double,character,byte,boolean,yes_no,true_false)length(typevarcharcolumnnameunsaved-value(sensible)例和从以前的session中装载过(可能又做过修改--译者注)但未再次持久化access(可选-默认为property):Hibernate用来属性值的策略。如果nameunsaved-valueHibernate3还有一个另外的<composite-id>定义可以旧式的多主键数据。我们强烈不<generator>元素(主键生成策用来为该持久化类的实例生成唯一的标识。如果这个实例需要某些配置值或者初始化参数,用<param>元素来传递。<idname="id"type="long"<generator<param所有的都实现org.hibernate.id.IdentifierGenerator接口。这是一Hibernate提供了很多内置的实现。下面是一些内置的快捷名字:long,shortint张表中插入数据时才能使用。在集群下不要使用。对DB2,MySQL,MSSQLServer,Sybase和Hy 支持。返回的标识符是long,short或者int类型的。(数据库自增)DB2,PostgreSQL,Oracle,SAPDB,McKoi(sequence),而在Interbase中使用(generator)。返回的标识符是long,short或者intlong,short或者int一个表和字段(默认分别是hibernate_unique_key和next_hi)作为值的来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。long,shortint用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串,它hibernateUUID包含:IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。Java代码中不可能获得MAC地址或者内存地址,JNIMSSQLServer和MySQLGUID根据底层数据库的能力选择identity,sequence或者hilo中的一个。(数据库save()<generator>元素没有使用另外一个相关联的对象的标识符。通常和<one-to-one>使用annotateonStrategy有四个值 、AUTOidentitycolumnsequencenative 、TABLEid 、IDENTITY-identity 、SEQUENCE-注意:auto是默认值,也就是说没有后的参数则表示为1、AUTO默publicintgetId(){return}或publicintgetId(){return}1 对于mysql,使用2 对于oracle使用hibernate_sequence(名称固定2、publicintgetId(){return}对DB2,MySQL,MSSQLServer,Sybase和Hy 支持。返回的标识符是long,short或者int类型的。(数据库自增)注意:此生成策略不支持3、publicintgetId(){return}DB2,PostgreSQL,Oracle,SAPDB,McKoi(sequence),而在Interbase中使用(generator)。返回的标识符是long,short或者int注意:此生成策略不支持4Oracle指定定义的参数注意:SEQ_Name:SequenceSEQ_DB_Name:SequencepublicclassTeacher{})参数:strategy:GenerationType.SEQUENCEpublicclassTeacher{privateintpublicintgetId()return5、TABLE用表保存idID,然后再给这个值累加一个值再次存入数据库,以便下次取Table主键生成策略的定义 pkColumnName="pk_key", varchar,keyvalueColumnName="pk_value", 字段名int,value 的第一个字段的值(keyinitialValue= 策略中使用该记录的第二个字段的值(value )createtableGENERATOR_TABLE(pk_keyvarchar(255),pk_valueinteger1。TABLE主键生成策略 pkColumnName="pk_key", varchar,keyvalueColumnName="pk_value", 字段名int,value 的第一个字段的值(keyinitialValue= 策略中使用该记录的第二个字段的值(value )publicclassTeacherprivateintid;publicintgetId()return注意:TeacherGENERATOR_TABLEpk_value1,GENERATOR_TABLEtable、pkColumnName、valueColumnName合主1、xml方实例场景:核算期publicclassFiscalYearPeriodprivateintfiscalYear;//核算年privateintfiscalPeriod;privateDatebeginDate;privateDateendDate;//结束日期privateStringperiodSts;//状态publicintgetFiscalYear(){return}publicvoidsetFiscalYear(intfiscalYear){this.fiscalYear=fiscalYear;}publicintgetFiscalPeriod(){ returnfiscalPeriod;}publicvoidsetFiscalPeriod(intfiscalPeriod){this.fiscalPeriod}publicDategetBeginDate(){returnpublicvoidsetBeginDate(DatebeginDate){ this.beginDate=beginDate;}publicDategetEndDate(){returnpublicvoidsetEndDate(DateendDate){ this.endDate=endDate;}publicStringgetPeriodSts() returnpublicvoidsetPeriodSts(StringperiodSts){this.periodSts=}复合主键的映射,一般情况把主键相关的属性抽取出来单独放入一个类中。而这个类是有要求的:必需实现序列化接口(java.io.Serializable)(可以保存到磁盘上),为了确定这个复合主键类所对应对象的唯一性就会产生比较,对象比较就需要复写对象的hashCode()、equals()方法(复写方法如下),然后在类中这个复合主键类复合主键类复合主键必需实现java.io.Serializable接publicclassFiscalYearPeriodPKimplementsjava.io.Serializable{privateintfiscalYear;//核算年privateintfiscalPeriod;//核算月publicintgetFiscalYear(){return}publicvoidsetFiscalYear(intfiscalYear)this.fiscalYear=}publicintgetFiscalPeriod(){returnfiscalPeriod;}publicvoidsetFiscalPeriod(intfiscalPeriod){this.fiscalPeriod=fiscalPeriod;}publicinthashCode()finalintprime=31;intresult=1;result=prime*result+fiscalPeriod;result=prime*result+fiscalYear;returnresult;}publicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnif(getClass()!=obj.getClass())returnfalse;FiscalYearPeriodPKother=(FiscalYearPeriodPK)obj;if(fiscalPeriod!=other.fiscalPeriod)returnif(fiscalYear!=other.fiscalYear)returnfalse;return实体类:(中了复合主键类)publicclassFiscalYearPeriod{privateFiscalYearPeriodPKfiscalYearPeriodPK;//复合主类privateDatebeginDate;//开始日期privateDateendDate;//结束日期privateStringperiodSts;//状态publicFiscalYearPeriodPKgetFiscalYearPeriodPK(){returnfiscalYearPeriodPK;}publicvoidsetFiscalYearPeriodPK(FiscalYearPeriodPKfiscalYearPeriodPK)this.fiscalYearPeriodPK=}FiscalYearPeriod.hbm.xml映射文<hibernate-map<composite-id<key-property<key-property</composite-<property<property<property</hibernate-map导出数据库输出SQL语句createtablet_fiscalYearPeriod(fiscalYearintegernotnull,fiscalPeriodintegernotnull,beginDatedatetime,endDatedatetime,periodStsvarchar(255),primarykey(fiscalYear,fiscalPeriod))//实体数据库表结构复合主键关联映射数据tx=session.beginTransaction();FiscalYearPeriodfiscalYearPeriod=newFiscalYearPeriodPKpk=newFiscalYearPeriodPK();fiscalYearPeriod.setFiscalYearPeriodPK(pk);//键fiscalYearPeriod.setEndDate(newDate());fiscalYearPeriod.setBeginDate(newDate());执行输出SQL语句Hibernate:insertintot_fiscalYearPeriod(beginDate,endDate,periodSts,fiscalYear,fiscalPeriod)values(?,?,?,?,?)数据的加载2、annotation方下面是定义组合主键的几种语将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为publicclassTeacherPKimplementsjava.io.Serializable{privateintid;privateStringpublicintgetId(){return publicvoidsetId(intid){this.id=id;}publicStringgetName(){ returnname;}publicvoidsetName(Stringname){ =name;}publicbooleanequals(Objecto){ publicinthashCode(){return }将组件类的属性注解为@Id,实体类中组件的publicclassTeacher{privateTeacherPKpk;privateStringpublicTeacherPKgetPk(){returnpk;将组件的属性注解为publicclassTeacher{privateTeacherPKpk;privateStringpublicTeacherPKgetPk(){returnpk;类注解为@IdClass,主键的属性都注解为@Id需要将复合主键类建立好,不需要进行任何注解在实体类中不需要进行复合主键类的classpublicclassTeacher{//privateTeacherPKpk;//不再需要privateintid;privateStringname;publicintgetId(){return publicvoidsetId(intid){this.id= publicStringgetName(){returnpublicvoidsetName(Stringname){=第14课Hibernate开发接口(作用:进行配置信息的管目标:用来产生configurehibernate加载默认的hibernate配置文件sessionFactory=加载指定hibernate的配置文只需要关注一个方法作用:主要用于产生Session的工厂(数据库连接池当它产生一个Session时,会从数据库连接池取出接,交给这Sessionsession= Session两方法的区别①、openSession是每次都打开一个新的Session②、OpenSessionclose,③、getCurrentSession上下文<property常用的是:①、thread:是从上下文找、只有当前没SessionSession,②、jta:ApplicationServer(Tomcat③、managed:④、custom.Class:1 管理一个数据库的任务单2 3 ObjectTransistent4 格式Session.load(Classarg0,Serializablearg1)throws*arg0:需要加载对象的类,例如*arg1: hibernate1此方法返回类型为Object,但返回的是对象SQLloadlazy(SQL*hibernate延迟加载实现原理是方式trysession=sf.openSession();UseruserSQLSystem.out.println("="+userpersistent。user.setName("}catch(HibernateExceptione){}if(session!=}}}5 格式:Session.get(Classarg0,Serializablearg1)方*arg0:需要加载对象的类,例如*arg1: 是基数类型,则hibernate会自动转换成包装类,如1Object,也就是对象,然后我们再强行转trysession=sf.openSession();SQLUserUseruser=(User)session.get(User.class,persistentSystem.out.println("="+步
userpersistentuser.setName("}catch(HibernateExceptione){}if(session!=}}6 load()与get()区②、load返回的是对象,等到真正使用对象的内容时才发出sql语句,sessionopen③、getget()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL7 detachedpersistent transient persistentsession 1:update/updatablexml:设定<property>的update属性,设置在更新时是否参数更<propertyname="name"注意:updatetrue(默认):参与更新;false:publicStringgetTitle(){return方法二:dynamic-update注意:此方法目前只适合xml方式,JAP1.0annotation没有对应在实体类的映射文件中的<class>中,使用dynamic-update属性,true:session(session),session<classname="com.bjsxt.Student"dynamic-代码publicvoidtestUpdate5()Students=(Student)session.get(Student.class,1);namespersistentspersistent态session2.getTransaction().commit();}session.merget()方法,合并字段内容publicvoidtestUpdate6()Students=(Student)session.get(Student.class,1); publicvoidtestUpdate7()Queryq"updateS='z5'wheres.id=1");}8 update,save9 session如果没有,才会去数据库查找,clear()方法可以强制清除session存Teachert=(Teacher)session.load(Teacher.class,1);Teachert2=(Teacher)session.load(Teacher.class,1);注意:这样就会发出两条SELECT语句,如果把session.clear()去除,则只会发出一条SELECT语句,因为第二次load时,是使用session缓存中ID1load10在hibernate中也存在flush这个功能,在默认的情况下 前时,其实执行了一个flush命令。Session.flush功能 insert、deleteSQLSession在什么情况下执行 注意:flush时,可以自己设定,使用session.setFlushMode(FlushMode)来指FlushMode的枚举值 FlushMode.ALWAYS:SQLflush flush( MIT:只有在commit时才flush FlushMode.MANUAL:手动flush。 FlushMode.NEVER:不flush 比如session取数据为只读时用,这样就注意:设置flush模式时,需要在session开启事务之前置 在执行查询前,如 注:如果主键生成策略是uuid等不是由数据库生成的,则session.save()时并不会发出SQL语句,只有flush时才会发出SQL语句,但如果主键生成策略nativesession.saveSQL11例如但是commit时使用,会抛出异常session=HibernateUtils.getSession();tx=session.beginTransaction();User1user=newUser1(); user.setCreateTime(newDate());user.setExpireTime(newuuid,saveusersessioninsertid,sessionexistsInDatabasesession.evict(user);//session(EntityEntrieshibernatesession(insertions)userinsertentityEntriesexistsInDatabasetrue,evictusersession解决在逐出session缓存中的对象不抛出异常的方法//flushhibernateuserexistsInDatabasefalsesession.evict(user);//session(EntityEntriesuserinsertsessionexistsInDatabase15状时对象(Transientnew是说它们没有任何跟数据库表相关联的行为,只要应用不再这些对象(不再被任何其它对象所),它们的状态将会丢失,并由回收机制回收久化对象(Persistent持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理,持久实例是在事务中进行操作 它们的状态在事务结束时同数据库线对象(Detachedhibernate种状态的区分1 有没有ID,(如果没有则是Transient状态2 ID在数据库中有没3 在内存里有没有(session缓存结Transient对象:随时可能被回收器回收(在数据库中没有于之对应的记session内存中一个象,没有ID,缓存中也没内存中有、存中有、数据库有Detached对象:也可能被回收器回收掉(数据库中存在对应的记录,只是没有任何对象它是指session),注引状态经过Persistent状态,没session内存有、缓存没有、数据库有16 存在以下关系1 一对 3 多对 4 多对 5 集合映 7 组件映 对一关联映 两个对象之间是一对一的关系,如-IdCard(人— 间的一一对应的关系;数据库表不会有额外的字段来它们之间的关系,仅 实体类/**人-实体类*/publicclass{privateintid;privateStringname;publicintgetId(){returnid; publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=}publicclassIdCardprivateintid;privateStringcardNo;publicintgetId(){returnpublicvoidsetId(intid){this.id=id;}publicStringgetCardNo(){returnpublicvoidsetCardNo(StringcardNo){this.cardNo=}(一)唯一外键关联-单向 1明人—->号(àIdCard),从IdCard看不到对2象模需要在类中持有IdCard的一个idCard,则IdCard中没有3系模idcard4体类注:IdCard是被对象,没有变化/**人-实体类publicclassprivateintid;privateStringname;privateIdCardidCard;//IdCard对publicintgetId(){returnid; publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}publicIdCardgetIdCard(){returnidCard;}publicvoidsetIdCard(IdCardidCard){this.idCard=}5xmlIdCard实体类的映射文件因为IdCard是被的,所以没有什么特殊的映<hibernate-map<classname="com.wjt276.hibernate.IdCard"<idname="id"<generator<property</hibernate-map实体类的映射文件在映射时需要添加一个外键的映射,就是指定IdCard的引<hibernate-map<classname="com.wjt276.hibernate." <idname="id"<generator<property<!--<many-to-one>:在多的一端(当前一端),加入一个外键(当前为idCard)IdCard),unique="true",这样就可以此字段唯一了。--><many-to-onename="idCard"</hibernate-map注意:这里的<many-to-one>中的name属性值并不是数据库中的字段名,而是实体类中IdCard对象成员属性的getxxx方法后面的xxx(此处是getIdCard,所以是idCard),要求第一个字段小写。如果不指定columnname6annotateon解映注意IdCard是被对象,除正常注解,无需要其它注/**publicclassIdCard{privateintid;privateStringcardNo;publicintgetId(){returnpublicvoidsetId(intid){this.id=id;}publicStringgetCardNo(){returncardNo;}publicvoidsetCardNo(StringcardNo){this.cardNo=} 对象的实体类需要使用@OneToOne进行注解,来表面是一对一的关如果省略@JoinColumnhibernate是:被对象名称_被对象的主键ID)/***/publicclass{privateintid;privateIdCardidCard;//IdCard对privateStringname;publicintgetIdreturnid;}publicIdCardgetIdCard(){returnidCard;}publicStringgetName(){returnname;}publicvoidsetId(intid){this.id=id;}publicvoidsetIdCard(IdCardidCard){this.idCard=idCard;}publicvoidsetName(Stringname){=name;}}7成的SQL句createtableIdCardidintegernotnullauto_increment,cardNovarchar(255),primary)createtableidintegernotnullauto_increment,primarykey(id))alteraddindexFK8E488775BE010483(idCard),addconstraintFK8E488775BE010483foreignkey(idCard)//外键referencesIdCard(id)//IdCard的id字8、测Sessionsession=IdCardidCard=newIdCard(); idCard,TransientidCard=new();.setName(" 一外键关联-双1明人<—->号(<->IdCard)双向:互相持有对方的2、对象模型:3系模型4体类实体类,只是相互持有对象的,并且要求getter和setter方5xml实体类映射文件:同单向的没有变化IdCard体类映射文件:如果使用同样的方法映射,这样就会在表中也添加一hibernateIDID了。也同样需要使用<one-to-one>来映射,但是需要使用property-ref属性来指定对象持有你自己的的成员属性名称(是gettxxxx后面的名称),这hibernate<classname="com.wjt276.hibernate.IdCard"<idname="id"<generator<property<!--<one-to-one>:告诉hibernate如何加载其关联对property-ref<one-to-onename=""property-一对一唯一外键关联映射双向需要在另一端(当前IdCard),添加<one-to-one>,指示hibernate如何加载其关联对象(或对象),默认根据主键 <!--<one-to- hibernateproperty-ref6、annotateon解映射注解映射同单向一样IdCard解映射如下:使用@OneToOnepublicclassIdCard{privateintid;privateStringcardNo;private//mappedBy:在指定当前对象在被对象的idCard做了映射//此值:当前对象持有对象中当前对象的成员属性名称(getXXX后//因为对象的持有IdCard对象的方法是getIdCard()因为需要idCardpublicget publicvoidset(){this. publicintgetId(){returnpublicvoidsetId(intid){this.id=id;}publicStringgetCardNo(){returncardNo;}publicvoidsetCardNo(StringcardNo){this.cardNo=}7SQL要相互加载对方,这由hibernate来完成。因为生成的sql语句同单向一样8、测试9结键关联-单向(不重系;数据库表不会有额外的字段来它们之间的关系,仅通过表的主键来关1明人—->号(àIdCard),从IdCard看不到对2象模3系模因为是idcard,所以idcard要求先有值。而的主键值不idcard4体类实体类同一对一唯一外键关联的实体类一个, 对象中持有对象的(代码见唯一外键关系)5、xml射IdCard映射文件,先生成<classname="com.wjt276.hibernate.IdCard"<id<generator<property实体类映射文件,ID是根据IdCard主键值<classname="com.wjt276.hibernate. <idforeign使用。再使用元素<param>的属性值指定相关联对象(这里相关联的对idCard,idCardid)为了能够在加载数据同时加载IdCard数据,所以需要使用一个<one-to-one>来设置这个功能。--><generator<!--元素<param>nameproperty--<param<property<!--<one-to-表示如何加载它的对象(这里对象就指idCard这里nameidCard),同时也说是一对一的关系。默认方式是根据主键加载(把中的主键取出再到IdCard中来取相关IdCard数据。)我们也此键也作为一个外键了IdCard,所以需要加一个数据库限制(外键约 6、annotateon解映射实体类注解publicclassprivateintprivateIdCardidCard;//IdCard对privateStringname;publicintgetId()returnid;}publicIdCardgetIdCard(){returnidCard;}publicStringgetName(){returnname;}publicvoidsetId(intid){this.id=id;}publicvoidsetIdCard(IdCardidCard){this.idCard=idCard;}publicvoidsetName(Stringname){=name;}}IdCard实体类,不需要持有对象的,正常注解就可以了7SQLcreatetableIdCardidintegernotnullauto_increment,primarykey)createtableidintegernotnull,primarykey(id))alteraddindexFK785BED805248EF3(id),addconstraintFK785BED805248EF3foreignkey(id)referencesidcard8、测session=HibernateUtils.getSession();tx=session.beginTransaction();IdCardidCard=newIdCard(); =new();.setName("TransientObjectExceptioncascade 9ID<id idcard,idCard<generator<param<property<!—one-to-one的含义:指示hibernate怎么加载它的关联对象,默认根 外键参照了idCard--><one-to-onename="idCard"键关联-双向(不重系;数据库表不会有额外的字段来它们之间的关系,仅通过表的主键来关主键关联映射,实际是数据库的结构并没有变化,只是要求双方都可以持有对象,也就是说实体模型变化,实体类都相互持有对方。1xml实体类映射文件不变,IdCard如下<classname="com.wjt276.hibernate.IdCard"<idname="id"<generatorclass="native"/><property <one-to-onename="2annotateon解映射的注解不变,同主键单向注解IdCard注解,只需要在持有对象的getXXX前加@OneToOne(mappedBy="idCard")publicclassIdCardprivateintid;privateStringcardNo;privatepublicget(){ (五)联合主键关联(Annotation方式{})publicWifegetWife()return}@JoinColumnreferencedColumnName二、component(组件)关联映Component联映射 以上关系的映射称为component(组件)关联映 ponent可以成为是值对象(DDD)。User体类publicclassUser{privateintid;privateStringprivateContactcontact;//值对象的publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName() returnpublicvoidsetName(Stringname){ =name;}publicContactgetContact(){ returncontact;}publicvoidsetContact(Contactcontact){ this.contact=}Contact对象publicclassContact{privateString;privateStringaddress;privateStringzipCode;privateStringcontact;publicStringget returnpublicvoidset(String){ this.=;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}publicStringgetZipCode(){returnzipCode;}publicvoidsetZipCode(StringzipCode){this.zipCode=zipCode;}publicStringgetContact(){returncontact;}publicvoidsetContact(Stringcontact){this.contact=}(四)xml--User映射文件(组件映<hibernate-map<classname="com.wjt276.hibernate.User"<idname="id"<generator<propertyname="name"<!--<component>用于映射Component(组件)关系--<component<propertyname="<property<property<propertyname="contact</hibernate-mapannotateon使用@EmbeddedpublicclassUserprivateintid;privateStringname;privateContactcontact;//值对象的publicintgetId() returnpublicContactgetContact(){returncontact;}publicvoidsetContact(Contactcontact){this.contact=Contact类是值对象,不是实体对象,是属于实体类的某一部分,因此没有映出数据库输出SQL句createtableUseridintegernotnullauto_increment,addressvarchar(255),contactvarchar(255),varchar(255),zipCodevarchar(255),namevarchar(255),primarykey(id))据表结构注:虽然实体类没有基本联系信息,只是有一个,但在映射数据库时全部件映射数据保存tx=session.beginTransaction();Useruser=newUser();Contactcontact=newContact(); 实体类中值对象时,不用先保存值对象,因为它不是实体类,它只是一个session.save()中保存的对象是实体类。三 多对一–单场景:hibernate对应于一个组,所以用户实体中应该有一个持有组的。象模型图系模型联映射的本质多个。体User实体类publicclassUser{privateintid;privateStringname;privateGrouppublicGroupgetGroup(){return publicvoidsetGroup(Groupgroup){this.group=group;}publicintgetId(){returnid; publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname) =Group实体类publicclassGroup{privateintid;privateStringname;publicintgetId(){returnpublicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=}实体类建立完后,开始创建映射文件,先建立简单的映射文件xml式:映射文件1Group体类的映射文件<hibernate-map<classname="com.wjt276.hibernate.Group"<idname="id"<generator<property</hibernate-map2User体类的映射文件<hibernate-map<classname="com.wjt276.hibernate.User"<idname="id"<generator<property<!--<many-to-one>name:是的属性(User.group),这样表示在多的一端表里加入一个字段名group,这样这个字段(groupid)group(t_group一端),也就是就在多的一端加入一个外键指向一的一端。--><many-to-onename="group"</hibernate-map3、※<many-to-one>例如:<many-to-onename="group"<many-to-one>联映射对一的关name:是的属性(User.group),这样表示在多的一端表里加入一个字段名称group,groupSQL(column="groupid").这样这个字段(groupid)group表(t_groupaltertablet_userdropforeignkeyFKCB63CCB695B3B5ACdroptableifexistst_groupdroptableifexistscreatetablet_group(idintegernotnul
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防治老鼠服务合同协议书
- 建筑桩基工程施工合同
- 电热水器维修合同
- 法律行业智能诉讼辅助工具研发方案
- 地暖承包合同
- 教育行业管理与教学实践指南
- 农业环境保护与管理指导书
- DeepSeek简单版使用指南
- 店面承包合作协议合同
- 集装箱活动房租赁合同样本
- XX学校服采购工作方案(含一封信、备案表、反馈表)
- GB/T 33107-2016工业用碳酸二甲酯
- GB/T 18938-2008家用和类似用途的面包片电烘烤器性能测试方法
- 简约卡通小学生校园文明礼仪教育PPT模板
- 劳动合同法经典讲义
- 三位数乘一位数练习题(精选100道)
- 教学第二章-毫针刺法1课件
- 产业园区环保管家实践和案例
- 医学约束带的使用课件
- 传染病防控工作职能部门间协调机制及流程
- 社会团体法定代表人登记表
评论
0/150
提交评论