您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > jpa学习笔记--值得一看
1Jpa学习笔记1:首先来说JPA是一个持久化规范,也就是说当我们用jpa的时候我们不需要去选面向hibernate的api编程了,这样就大大降低了偶和度了2:JPA是一种规范,那么它的编程有哪些要求呢?2.1:首先我们的在src下面加上一个META-INF目录在该文件夹下面加上一个persistence.xml文件,这个文件的规范写法?xmlversion=1.0?persistencexmlns=:xsi=:schemaLocation=://java.sun.com/xml/ns/persistence/persistence_1_0.xsdversion=1.0!--file:///D:\hibernate\hibernate-entitymanager-3.3.2.CR1\resources\org\hibernate\ejb\persistence_1_0.xsd--persistence-unitname=juntransaction-type=RESOURCE_LOCALproviderorg.hibernate.ejb.HibernatePersistence/providerpropertiespropertyname=hibernate.dialectvalue=org.hibernate.dialect.MySQL5Dialect/propertyname=hibernate.connection.driver_classvalue=org.gjt.mm.mysql.Driver/propertyname=hibernate.connection.usernamevalue=root/propertyname=hibernate.connection.passwordvalue=root/propertyname=hibernate.connection.urlvalue=jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8/propertyname=hibernate.max_fetch_depthvalue=3/propertyname=hibernate.hbm2ddl.autovalue=update/propertyname=hibernate.jdbc.fetch_sizevalue=18/propertyname=hibernate.jdbc.batch_sizevalue=10/propertyname=hibernate.show_sqlvalue=true/propertyname=hibernate.format_sql2value=false//properties/persistence-unit/persistence这个文件中的写话我们可以再hibernate的jpa实现包里面找到对应的例子,这里我是使用的是hibernate来实现JPA实现,上面的配置也都和heibernate差不太多值得注意的:persistence-unitname=juntransaction-type=RESOURCE_LOCALPersistence-unit持久性化单元,我们可以随便命名但是在后面回到他的,通过它来找到相关的配置信息transaction-type是指事物的类型,在通常情况下我们是本地的,但是当我们遇到两个数据库保存的时候我们会到到JTA事物来控制事务,也就是二次提交2.2:把相关的hibernate包和它实现ejb3的实现包都加入到项目中3:如何用实体类来映射数据表@Entity//就是告诉JPA我是一个实体bean@Table(name=t_person)//作为修改表名,默认情况是类名publicclassPerson{/***GenerationType.AUTO它会根据数据库方言来选择正确的生成策略*默认情况下就是AUTO*/@Id//映射主键@GeneratedValue(strategy=GenerationType.AUTO)privateIntegerid;//映射一列到数据库中length是指字段的长度,nullable是指是否为空,默认情况是空,当我们不想让类字段名与数据库名一样的时候用到的@Column(length=10,nullable=false,name=personname)privateStringname;//映射日期类型TemporalType有好几种映射方式,我们可以根据自己的需求选择正确的映射方式@Temporal(TemporalType.DATE)@Column(nullable=false)3privateDatebirthday;//用枚举类型来映射性别EnumType有好几种映射方式,这里使用的是枚举的String类型,我们也一个选择枚举的索引@Enumerated(EnumType.STRING)@Column(nullable=false,length=5)privateSexsex=Sex.MEN;//对应大文本和图片就是二进制@LobprivateStringinfo;//支持延迟加载(减少内存的消耗)@Lob@Basic(fetch=FetchType.LAZY)privateByte[]image;//不想这个字段与数据库表映射@TransientprivateStringimagepath;getset方法…………………………………………………….4:如何利用jpa来操作数据库呢@TestpublicvoidtestSave(){/***jun是在persistence.xml中持久化单元名称*/EntityManagerFactoryfactory=Persistence.createEntityManagerFactory(jun);//---SessionFactory--session--beginEntityManagerem=factory.createEntityManager();em.getTransaction().begin();//开启事物Personperson=newPerson(刘文军);person.setBirthday(newDate());em.persist(person);System.out.println(-----+person.getSex().getName());em.getTransaction().commit();4em.close();factory.close();}这里我们EntityManagerFactory就相当于Hibernate中的SessionFactory,然而EntityManager就相当于Hibernate中的Session。在JPA中我们获得它的方式是Persistence.createEntityManagerFactory(jun);jun是在persistence.xml中持久化单元名称EntityManagerem=factory.createEntityManager();其中EntityManager中的几种操作数据库方法有Persist(),find(),getReference(),merge(),remove()这里我就列出几种常见的这里说有的getReference()就相当于Hibernate中的Load()支持Lazy加载,getReference它会查找一个代理对象,当访问它的属性的时候它才会向数据库操作但是值得注意的这个必须确保Session是打开状态5:我们来讨论一下实体bean的几种状态5.1:新建状态:new一个实体的时候它所处于的状态5.2:托管状态:这个状态非常重要,当一个实体bean是托管状态的时候我们修改它的属性值得话,即使我们没有用到hibernate中的相关方法操作数据库,她也会同步到数据库里的,托管就是从数据库里面查询到的一个对象,记住,托管状态必须的和事物关联上来em.getTransaction().begin();person.setName(小刘);em.getTransaction().commit();em.close();factory.close();5.3:游离状态:当我们使用EntityManager中的clear()方法的时候,它会把事物管理器中的所有实体变成游离状态,处在游离状态的实体bean,我们修5改它的属性它不会同步到数据库中的em.getTransaction().begin();em.clear();//把实体管理器中的所有实体都变成游离状态person.setName(老刘);em.merge(person);em.getTransaction().commit();em.close();factory.close();5.4:关闭状态:就是当我们把Session关闭的时候,实体bean处于德状态6:JPA是如何于实现产品对接的呢EntityManagerFactoryfactory=Persistence.createEntityManagerFactory(jun);Persistence会去找META-INF/service/javax.persistence.spi.PersistenceProvider的相关驱动,如果有多个JPA实现产品的jar包的话它会随机的用一个产品的实现,这样就可以创建出来EntityManagerFactory7:在JPA中我们如何使用EJQL语句7.1:查询publicvoidquery(){/***jun是在persistence.xml中持久化单元名称*/EntityManagerFactoryfactory=Persistence.createEntityManagerFactory(jun);//---SessionFactory--session--beginEntityManagerem=factory.createEntityManager();Queryquery=em.createQuery(selectofromPersonowhereo.id=?1);query.setParameter(1,2);///***Personperson=(Person)query.getSingleResult();6*这个就相当于Hibernate中的uniqueResult();*如果没有查询到数据的话会出错的,所有我们一般不这样做*我们先得到List然后遍历它*/ListPersonlist=query.getResultList();for(Personperson:list)System.out.println(----------+person.getName());query=em.createQuery(selectcount(o)fromPersono);Longcount=(Long)query.getSingleResult();System.out.println(----------+count);em.close();factory.close();}7.2:删除查询(记得要开启事物)publicvoiddeletequery(){/***jun是在persistence.xml中持久化单元名称*/EntityManagerFactoryfactory=Persistence.cr
本文标题:jpa学习笔记--值得一看
链接地址:https://www.777doc.com/doc-4055442 .html