2023年JPA学习笔记.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2023年JPA学习笔记.docx》由会员分享,可在线阅读,更多相关《2023年JPA学习笔记.docx(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目录目录1一、JPA基础21.1JPA基础21.2JPA开发过程31.3 实体的生命周期及实体管理器常用方法4二、环境搭建52.1 添加JPA支持62.2 添加配置文献62.3测试配置62.4 环境搭建附表6三、常用注解123.1 批注完全参考123.2 ID相关的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.
2、4继承映射21五、JPQL21六、常见异常22一、JPA基础1.1JPA基础JPA:java persistence api支持XML、JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范元数据:对象和表之间的映射关系实体:entity,需要使用Javax.persistence.Entity注解或xml映射,需要无参构造函数,类和相关字段不能使用final关键字游离状态实体以值方式进行传递,需要serializableJPA是一套规范、有很多框架支持(如Hibernate3.2以上、Toplink,一般用Hibernate就行 oracle可以用toplink)JPQL1、
3、与数据库无关的,基于实体的查询语言2、操作的是抽象持久化模型3、JPQL是一种强类型语言,一个JPQL语句中每个表达式都有类型4、EJBQL的扩展5、支持projection(可以查询某个实体的字段而不需要查询整个实体)、批量操作(update、delete)、子查询、join、group by having(group by聚合后 having 聚合函数 比较 条件)弱类型语言:没有明显的类型、根据情况变化、容易犯错强类型语言:没个变量都有固定的类型。不容易犯错虽然JPA规范中明确表达无法访问一个集合关系字段抽象模型类型:JPQL规范将一个实体(属性)中所饮食的各种类型称为抽象模型类型状态字
4、段关联字段查询多个字段查出来的是个对象值数组1.2JPA开发过程JPA配置文献声明持久化单元-配置文献persistence.xml编写带标注的实体类编写Dao类xml配置事务类型分为:RESOURCE_LOCAL本地事务、JTA(java事务API)注解Entity将JavaBean标注为一个实体 name属性Table数据库中的表,name名称、catalog数据库名Secondary Table/Secondary Tables多个表Id定义了实体的主键信息GeneratedValue逐渐省城策略GeneratedValue(Strategy = GenerationType.SEQUE
5、NCE)SequenceGenerator(name=SEQ_TEST,sequenceName=User_SEQ,allocationSize=25)column属性、字段相应的表字段Temporal属性是时间类型的话可以细分DATEjava.sql.DateTIMEjava.sql.TimeTIMESTAMPjava.sql.TimestampLob标注CLOB、BLOBBase 是否延迟加载Base(fetch = FETCHTYPE.LAZY/FETCHTYPE.EAGER)Transient实体bean中,所有非static、非transient状态变量、字段都要被持久化假如有字段、
6、变量在数据库中没有相应,标注为transient就可以不被持久化标注方式:标注在字段上标注在变量上实体类写法:1、必须有无参的构造函数2、没有final类型的变量或方法3、不可以是public类型的,只能通过get、set方法读写管理实体PersistenceEntityManagerFactoryEntityManagerPersistence.createEntityManagerFactory(persistence.xml中配置的persistence unit).createEntityManager()获取EntityManager1.3 实体的生命周期及实体管理器常用方法Enti
7、tyManager声明周期Java对象实体管理器数据库1、新实体(new)存在不存在不存在2、持久化实体(managed)存在存在存在3、分离的实体(detached)不存在不存在存在4、删除的实体(removed)存在存在不存在newpersist()find()commit()、clear()DB managed detachedmerge()remove()removed常用方法1、persist(Object)持久化2、remove(Object)删除对象3、find(Class entityClass,Object key)根据主键查询4、flush()实体与底层同步,执行sql5、
8、createQuery()创建JPQL查询对象5、createNativeQuery()根据普通SQL查询5、createNamedQuery()命名查询NamedQuerie标注5、merge(Object)将一个detached的实体持久化到EntityManager中5、close()关闭管理器javax.persistence.Queryint executeUpdate()执行更新、删除、添加Object getSingleResult()执行查询(返回一条记录)List getResultList()执行查询(返回结果链表)Query setParameter(int positi
9、on,object value)给Query对象设立参数Query setMaxResults(int maxResult)给Query对象设立返回数Query setFirstResult(int firstResult)给Query对象设立返回偏移参数查询(只能用一种)命名参数查询select u from User where id = :uid;setParameter(uid,value);位置参数查询-Person person = em.find(Person.class,1); /相称于Hibernate的getPerson person = em.getReference(P
10、erson.class,1);/相称于Hibernate的load返回一个代理对象/注意延迟加载时的 事务没关闭的时候才好用find 假如找不到返回的是个null,这时候下面在调用null的方法报nullpoint异常reference相称于延迟加载 假如找不到,会在第一次使用就报EntityNotFound异常回调函数(相称于拦截器,下面的方法执行前后调用指定的方法)PrepersistPostPersistPreRemovePostRemovePreUpdatePostUpdatePostLoad载入实体时(find、查询、refresh)-二、环境搭建2.1 添加JPA支持1、准备JPA
11、用到的jar包(JPA支持包)2、window preferences Java BuildPath User Librariesnew User LibraryAdd Jars3、项目 右键 properties(alt+Enter) Java Build Path Libraries Add Library User Library 自己定义的JPA支持包2.2 添加配置文献1、项目中SRC目录下添加META-INF目录(与Web项目下META-INF同名)2、在新添加的META-INF中添加配置文献persistences.xmlpersistence.xml配置信息 (Hibernat
12、e)数据库连接信息查询重要配置信息:事务类型:本地事务、JTA事务JPA供应商数据库驱动、URL、User、Password3、在SRC目录下添加log4j.properties文献(显示数据库操作信息的)2.3测试配置1、MySQL测试数据库 2、实体注解3、JUNIT测试方法2.4 环境搭建附表persistence.xml配置信息persistence version=1.0 xmlns= xmlns:xsi= xsi:schemaLocation=:/org.hibernate.ejb.HibernatePersistence自动创建|更新|验证数据库表结构。假如不是此方面的需求建议s
13、et value=none。容易导致数据丢失,一般在测试的时候才用、validate 验证数据库表结构create每次加载Hibernate都会删除上一次的表结构,根据model重新生成create-drop每次加载创建,sessionFactory关闭表就自动删除update加载Hibernate就更想你表结构环境测试代码实体注解EntityTable(name=Person)public class Person IdColumn(name=pid)private Integer id;Column(name=pname)private String name;public Integer
14、 getId() return id;public void setId(Integer id) this.id = id;public String getName() return name;public void setName(String name) this.name = name;JUNIT测试方法public EntityManager testGetEM()EntityManagerFactory emf = Persistence.createEntityManagerFactory(JPA);EntityManager em = emf.createEntityManag
15、er();return em;public void testAddPerson()Person p = new Person();p.setId(1);p.setName(ader);EntityManager em = testGetEM();EntityTransaction et = em.getTransaction();try et.begin();em.persist(p);mit(); catch (Exception e) e.printStackTrace(); MySQL测试数据库drop database if exists jpa;create database jp
16、a;use jpa;drop table if exists person;drop table if exists ident;drop table if exists rel;create table person(pid int primary key auto_increment,pname varchar(50);create table ident(iid int primary key auto_increment,iname varchar(50);create table rel(personid int,identid int); JPA支持包antlr-2.7.6.jar
17、cglib-2.1.3.jarclasses12.jarcommons-collections-3.1.jardom4j-1.6.1.jarehcache-1.2.3.jarejb3-persistence.jarhibernate3.jarhibernate-annotations.jarhibernate-cglib-repack-2.1_3.jarhibernate-commons-annotations.jarhibernate-entitymanager.jarjavassist-3.4.GA.jarjta-1.1.jarlog4j-1.2.15.jarpersistence-api
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 JPA 学习 笔记
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内