j2ee架构与程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

J2EE架构与程序设计第三讲HibernateHibernate简介Hibernate是一个持久化框架,主要用于ORM(Object/RelationalMapping)映射。问题:什么是持久化框架为什么要用ORMHibernate与EJB是什么关系开发Hibernate程序基本步骤配置Hibernate:指定数据库连接,指定映射文件(默认名:hibernate.cfg.xml)建立映射文件:告诉Hibernate那个实体类对应哪个表,哪个属性对应哪个字段建立实体Bean建立会话工厂:用对话工厂获得HibernateSession对象是个好习惯,因为在程序中经常需要获得Session使用Hibernate操作数据库hibernate.cfg.xmlhibernate-configurationsession-factorypropertyname=dialectorg.hibernate.dialect.MySQLDialect/propertypropertyname=connection.urljdbc:mysql://localhost/techsys/propertypropertyname=connection.usernameroot/propertypropertyname=connection.passwordroot/propertypropertyname=connection.driver_classcom.mysql.jdbc.Driver/propertymappingresource=entity/Role.hbm.xml/mappingresource=entity/Audit.hbm.xml//session-factory/hibernate-configurationRole.hbm.xmlhibernate-mappingclassname=entity.Roletable=rolecatalog=techsysidname=roleCodetype=java.lang.Stringcolumnname=roleCode/generatorclass=assigned//idpropertyname=nametype=java.lang.Stringcolumnname=name//property/class/hibernate-mapping资料:generator详解实例:修改书籍查询对角色表(Role)的,增删改查Chapter17/addrecord.jsp持久化对象之间的关系不同的session加载同一条数据形成的实体对象是不同的,反之是相同的。Sessionsession1=sessionFactory.openSession();Sessionsession2=sessionFactory.openSession();Useruser1=(User)session1.get(User.class,id);Useruser2=(User)session1.get(User.class,id);Useruser3=(User)session2.get(User.class,id);if(user1==user2)If(user1==user3)If(user1.equals(user3))session相关操作加载实体:session.get、session.load刷新实体:session.refresh判断是否有脏数据:session.isDirty();强制持久化:session.flush复合主键先把多个主键属性封装在一个类中利用composite-id标签配置复合主键composite-idname=idclass=chapter17.entity.MykeysIdkey-propertyname=deptCodetype=java.lang.Stringcolumnname=DeptCode//key-propertykey-propertyname=personCodetype=java.lang.Stringcolumnname=PersonCode//key-property/composite-id使用使用实例PKAction.java组件映射若Teacher和Student类中都有firstName和lastName属性,则可以用一个Name属性进行封装PublicclassName{privateStringfirstName;privateStringlastName}PublicclassTeacher{privateNamename;privateintcourseID}PublicclassStudent{privateNamename;…}xml如下配置componentname=“name”class=“Name”propertyname=“firstName”column=“firstName”propertyname=“lastName”column=“lastName”/component基于注释的组件映射@Embedded@AttributeOverrides({@AttributeOveride(name=“firstName”,column=@Column(name=“firstName”))@AttributeOveride(name=“lastName”,column=@Column(name=“lastName”))})多对一单向关联关系通常,对于数据库中的关联关系在Hibernate中我们通过组件的方式加以封装,以此达到统一存取的目的。many-to-onename=customersclass=chapter19.entity.Customersfetch=selectcascade=save-updatecolumnname=customer_id//many-to-oneName:实体Bean的属性名Column:外键名Class:关联类的名称Cascade:该属性指定哪些操作时级联操作,上例中save-update表示在save或update时候进行级联操作基于注释的多对一关系@ManyToOne@Cascade(value=(org.hibernate.annotations.CascadeType.SAVE_UPDATE))@JoinColumn(name=customer_id)其它关联关系一对多(one-to-many)一对一(one-to-one)Hibernate查询标准查询API(Criteria)HQL查询SQL查询HQLHql(HibernateQueryLanguage)是Hibernate框架提供的一种数据操作方式,其语法上非常接近SQL,不同的是HQL是面向对象的,使用HQL可直接返回相应的持久化对象。另外,Hibernate也可以将SQL查询出来的数据转换为持久化对象注意:在HQL中实体Bean的名称和属性是区分大小写的,但HQL中的关键字不区分大小写,如from可以写成FromHQL的使用StringqueryString=“fromMykeysasmodelwheremodel.name=:name”;//创建HQL语句QueryqueryObject=getSession().createQuery(queryString);//创建查询对象queryObject.setParameter(“name”,value);//设置参数queryObject.list();//执行查询注意错误:Exceptioninthreadmainjava.lang.NoSuchMethodError:antlr.collections.AST.getLine()IHQL查询不使用select:返回实体Bean对象列表fromorders–返回orders对象列表使用select:返回某个属性的值列表selectnumberfromorders则返回的orders中为String类型的列表针对同名实体的查询在查询时可以使用包指定查询的类selectchapter17.entity.mymessagemHQL分页利用Query的setFirstResult和setMaxResults方法进行分页例:Sessionsession=HibernateSessionFactory.getSession();Queryq=session.createQuery(fromOrders);q.setFirstResult(1);//从第2条记录开始q.setMaxResults(2);//每页取2条Listlist=q.list();查询缓存若使用Hibernate缓存查询则Hibernate在执行时会先在缓存中找寻先前执行过的的同样的HQL的查询结果,若找到则直接从缓存中取数据,从而达到快速查询的目的使用缓存一、在配置文件中打开缓存并指定缓存类propertyname=“cache.user_query_cache”true/propertypropertyname=“cache.provider_class”org.hibernate.cache.HashtableCacheProvider/property二、执行Query对象的setCacheable方法进行缓存查询命名查询可以把HQL语句写到xml中,在程序中加以引用(P638)第一步:?xmlversion=1.0encoding=UTF-8?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD//ENhibernate-mappingqueryname=firstHql![CDATA[fromOrderwhereid=1]]/query/hibernate-mapping第二步:把上述xml配置到hibernate.cfg.xml中MyEclipse支持所有的实体及配置可以通过MyEclipse反向工程生成使用注释(Annotations)配置Hibernate安装Hibernate注释MyEclipse6.5以上版本带有注释包hibernate-annotations.jarhibernate-commons-annotations.jarejb3-persistence.jar@Entity注释将一个JavaBean标识成实体Bean,用@Entity注释的Bean必须满足以下条件:必须有一个无参数的构造方法实体Bean必须声明为public实体Bean不能被声明为abstract@Table注释指明实体Bean对应的表信息属性name:表名称(默认类名)属性catalog:数据库名称@Entity@Table(name=“t_user”,catalog=“mydb”)PublicclassUser{…}@id注释配置主键,可以是一个属性也可以是多个属性的组合。主键可以应用于属性页可以应用于get方法,应用于属性时,改属性的get方法不会被Hibernate调用,可以去掉@GeneratedValue注释可指定主键访问策略@Generate

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功