目录目录............................................................1一、JPA基础.....................................................21.1JPA基础...............................................21.2JPA开发过程...............................................31.3实体的生命周期及实体管理器常用方法............................4二、环境搭建.....................................................52.1添加JPA支持..............................................62.2添加配置文件..............................................62.3测试配置..................................................62.4环境搭建附表..............................................6三、常用注解....................................................123.1批注完全参考.............................................123.2ID相关的................................................123.3主键生成策略..............................................133.4字段、添加字段、添加表关联..................................133.5映射相关.................................................143.6其他....................................................14四、JPA映射....................................................144.1一对一映射...............................................154.1.1共享主键映射........................................154.1.2关联外键映射........................................174.1.3添加表关联..........................................174.2一对多关联...............................................184.2.1添加字段的一对多、多对一关联...........................184.2.2添加表的一对多、多对一关联.............................194.3多对多关联...............................................204.4继承映射.................................................21五、JPQL.......................................................21六、常见异常....................................................22一、JPA基础1.1JPA基础JPA:javapersistenceapi支持XML、JDK5.0注解俩种元数据的形式,是SUN公司引入的JPAORM规范元数据:对象和表之间的映射关系实体:entity,需要使用Javax.persistence.Entity注解或xml映射,需要无参构造函数,类和相关字段不能使用final关键字游离状态实体以值方式进行传递,需要serializableJPA是一套规范、有很多框架支持(如Hibernate3.2以上、Toplink,一般用Hibernate就行oracle可以用toplink)JPQL1、与数据库无关的,基于实体的查询语言2、操作的是抽象持久化模型3、JPQL是一种强类型语言,一个JPQL语句中每个表达式都有类型4、EJBQL的扩展5、支持projection(可以查询某个实体的字段而不需要查询整个实体)、批量操作(update、delete)、子查询、join、groupbyhaving(groupby聚合后having聚合函数比较条件)弱类型语言:没有明显的类型、根据情况变化、容易出错强类型语言:没个变量都有固定的类型。不容易出错虽然JPA规范中明确表示无法访问一个集合关系字段抽象模型类型:JPQL规范将一个实体(属性)中所饮食的各种类型称为抽象模型类型状态字段关联字段查询多个字段查出来的是个对象值数组1.2JPA开发过程JPA配置文件声明持久化单元--配置文件persistence.xml编写带标注的实体类编写Dao类xml配置事务类型分为:RESOURCE_LOCAL本地事务、JTA(java事务API)注解@Entity将JavaBean标注为一个实体name属性@Table数据库中的表,name名称、catalog数据库名@SecondaryTable/@SecondaryTables多个表@Id定义了实体的主键信息@GeneratedValue逐渐省城策略@GeneratedValue(Strategy=GenerationType.SEQUENCE)@SequenceGenerator(name=SEQ_TEST,sequenceName=User_SEQ,allocationSize=25)@column属性、字段对应的表字段@Temporal属性是时间类型的话可以细分DATEjava.sql.DateTIMEjava.sql.TimeTIMESTAMPjava.sql.Timestamp@Lob标注CLOB、BLOB@Base是否延迟加载@Base(fetch=FETCHTYPE.LAZY/FETCHTYPE.EAGER)@Transient实体bean中,所有非static、非transient状态变量、字段都要被持久化如果有字段、变量在数据库中没有对应,标注为transient就可以不被持久化标注方式:标注在字段上标注在变量上实体类写法:1、必须有无参的构造函数2、没有final类型的变量或方法3、不可以是public类型的,只能通过get、set方法读写管理实体PersistenceEntityManagerFactoryEntityManagerPersistence.createEntityManagerFactory('persistence.xml中配置的persistenceunit').createEntityManager()获取EntityManager1.3实体的生命周期及实体管理器常用方法EntityManager声明周期Java对象实体管理器数据库1、新实体(new)存在不存在不存在2、持久化实体(managed)存在存在存在3、分离的实体(detached)不存在不存在存在4、删除的实体(removed)存在存在不存在new↓persist()find()↓commit()、clear()DB→→→→→→managed→→→→→→detached↓←merge()↓↓remove()removed常用方法1、persist(Object)持久化2、remove(Object)删除对象3、find(ClassentityClass,Objectkey)根据主键查询4、flush()实体与底层同步,执行sql5、createQuery()创建JPQL查询对象5、createNativeQuery()根据普通SQL查询5、createNamedQuery()命名查询@NamedQuerie标注5、merge(Object)将一个detached的实体持久化到EntityManager中5、close()关闭管理器———————————————————————————————————————javax.persistence.QueryintexecuteUpdate()执行更新、删除、添加ObjectgetSingleResult()执行查询(返回一条记录)ListgetResultList()执行查询(返回结果链表)QuerysetParameter(intposition,objectvalue)给Query对象设置参数QuerysetMaxResults(intmaxResult)给Query对象设置返回数QuerysetFirstResult(intfirstResult)给Query对象设置返回偏移参数查询(只能用一种)命名参数查询selectufromUserwhereid=:uid;setParameter(uid,value);位置参数查询------------------------------------------------------------Personperson=em.find(Person.class,1);//相当于Hibernate的getPersonperson=em.getReference(Person.class,1);//相当于Hibernate的load返回一个代理对象//注意延迟加载时的事务没关闭的时候才好用find如果找不到返回的是个null,这时候下面在调用null的方法报nullpoint异常reference相当于延迟加载如果找不到,会在第一次使用就报EntityNotFound异常回调函数(相当于拦截器,下面的方法执行前后调用指定的方法)@Prepersist@PostPersist@PreRemove@PostRemove@PreUpdate@PostUpdate@PostLoad载入实体时(find、查询、refresh)-----------------------------------------------------------------二、环境搭建2.1添加JPA支持1、准备JPA用到的jar包(JPA支持包)2、window→preferences→Java→BuildPath→UserLibraries→newUserLibrary→AddJars3、项目→右键→properties(alt+Enter)→JavaBuildPath→Libraries→AddLibrary→UserLibrary→自己定义的JPA支持包2.2添加配置文件1、项目中SRC目录下添加META-INF目录(与Web项目下META-INF同名)2、在新添加的META-INF中添加配置文件persistences.xmlpersistence.xml配置信息(Hibernate)数据库连接信息查询主要配置信息:事务类型:本地事务、JTA事务JPA供应商数据库驱动、URL、User、Password3、在SRC目录下添加log4j.properties文件(显示数据库操作信息的)2.3测试配置1、MySQL测试数据库2、实体注解3、JUNIT测试方法2.4环境搭建附表persistence.xml配置信息?xmlversion=1.0encoding=UTF-8?persistenceversion=1.0xmlns=h