概述 JPA(Java Persistence API)是Sun官方提出的Java持久化规范(JAVA5.0) 它的出现是为了简化现有的持久化开发工作和整合ORM技术,结束现在的Hibernate,TopLink,JDO等ORM框架各自为营的局面 JPA是在现有ORM框架的基础上发展而来的,可以认为是现有ORM框架抽象出来的接口,他的主导者正是hibernate的创始人 JPA只是一个规范,由各个ORM框架厂商负责实现 JPA是现有ORM框架功能的一个子集 JPA的优点 JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,不能取代现有的hibernate,topLink等ORM框架. 相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化供应商 应用可以在不修改代码的情况下载任何JPA环境下运行,真正做到低耦合,可扩展的程序设计.JPA是一个必然的发展趋势 包含技术 ORM映射元数据 JPA支持XML和JDK5.0注解两种元数据的形式 元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中 Java持久化API 用来操作实体对象,执行CRUD操作 框架在后台替我们完成所有的事情,开发者可以从繁杂的JDBC和SQL代码中解脱出来 查询语言(JPQL) 通过面向对象而非面向数据库的查询语言查询数据,避免程序和SQL语句紧密耦合 所需jar包(hibernate) 核心包(/hibernate/hibernate-distribution-3.3.1.GA) /hibernate3.jar /lib/bytecode/cglib/hibernate-cglib-repack-2.1_3.jar /lib/required/*.jar 注解包(/hiberante/hibernate-annotations-3.4.0.GA) /hibernate-annotations.jar /lib/ejb3-persistence.jar /lib/hibernate-commons-annotations.jar 针对JPA的实现包(/hibernate/hibernate-entitymanager-3.4.0.GA) /hibernate-entitymanager.jar /lib/test/log4j.jar /lib/test/slf4j-log4j12.jar 第一个JPA程序HelloWorld 创建项目 导入jar包(别忘了jdbc驱动jar) 创建配置文件 在src下创建META-INF文件夹,新建persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/数据库名"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="1234"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence> 编写javabean @Entity public class User { private Integer id; private String name; @Id @GeneratedValue public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 测试代码 //提供数据 User user = new User(); user.setName("张三"); //获得实体管理对象工厂,相当于SessionFactory EntityManagerFactory factory = Persistence.createEntityManagerFactory("default"); //获得实体管理对象,相当于Session EntityManager em = factory.createEntityManager(); //开启事务 em.getTransaction().begin(); //持久化对象 em.persist(user); //提交事务 em.getTransaction().commit(); //释放资源 em.close(); factory.close(); 配置文件 JPA规范要求在类路径的META-INF目录下放置persistence.xml,文件的名称是固定的 内容示例 <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/数据库名"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="1234"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence> 说明 <persistence-unit> 持久化单元 name 名称,获取EntityManagerFactory对象时要使用 transaction-type 事务类型,有RESOURCE_LOCAL(本地事务)和JTA(前置事务),不同数据库之间控制事务只能使用前置事务 <property> 指定属性 name 属性名称 value 属性值 注解(javax.persistence) javabean类声明上方 @Entity 作用: 标注javabean 位置: javabean类声明上方 @Table 作用: 指定数据库表的规则 位置: javabean类声明上方 参数: name 指定表名,默认为javabean的类名首字母小写 字段声明上方, 或字段get属性声明上方 @Id 作用: 标注主键 @GeneratedValue 作用: 指定主键的值的规则 参数: strategy 指定主键生成策略 GenerationType.IDENTITY 采用数据库的自动增长 GenerationType.SEQUINCE 采用数据库的序列 GenerationType.TABLE 采用一张表维护 GenerationType.AUTO 根据实际情况使用上述三种方式之一,默认值,可以省略 @Column 作用: 指定数据库列的规则 参数: name 指定列名,默认为javabean的get属性的属性名 length 指定列长度,值为int nullable 指定列是否可以为null,值为boolean @Temporal 作用: 指定数据库的日期类型 参数: value 指定数据库的日期类型 TemporalType.DATE 保存日期 TemporalType.TIME 保存时间 TemporalType.TIMESTAMP 保存日期时间 @Enumerated 作用: 指定枚举字段保存到数据库的方式 参数: value 指定枚举字段保存到数据库的方式 EnumType.STRING 保存枚举类型的字面值 EnumType.ORDINAL 保存枚举类型的索引值 @Lob 作用: 指定大文本数据类型 或 二进制数据类型 (java类型分别为String,和byte[]) @Transient 作用: 指定字段不作为持久化字段,数据库自动创建表时不会存在对应的列 @Basic 作用: 指定基本属性 参数: fetch 指定属性的加载类型(是否延迟加载) FetchType.EAGER 立即加载 FetchType.LAZY 延迟加载(即访问该属性时,才会去查询数据库) JPA API EntityManager 获取对象 T find(Class<T>,id) //相当于hibernate中的get() T getReference(Class<T>,id) //具有延迟加载作用,相当于hibernate的load() 更新对象 merge(obj) 将游离状态的对象变为托管状态,提交事务时会提交改变 持久化对象 persist(obj) 删除对象 remove(obj) 创建JPQL语句 Query createQuery(jpql) 其它 clean() 将EntityManager对象中的所有托管对象变为游离状态 refresh(obj) 刷新对象的值,直接从数据库中查询,而不是从缓存中获取 Query 获得方式 EntityManager对象的createQuery方法 常用方法 setParameter() 设置参数 getResultList() 获得查询结果List getSingleResult() 获得唯一结果 executeUpdate() 执行更新语句 JPQL语句 语句示例 查询 select o from User o where o.id=?1 删除 delete from User o where o.id=?1 更新 update Person o set o.name=:name where o.id=:id 可以给占位符进行编号 Query query = em.createQuery("select o from User o where o.id=?1"); query.setParameter(1,2); 可以设置占位符名称 Query query = em.createQuery("select o from User o where o.id=:id"); query.setParameter("id",2); JPA实体状态 new 新建 managed 托管:查询到的数据 游离: 删除 关联关系映射 在JPA中,多的一端为关系维护端,负责外键记录的更新. 一对多 例:用户(User)和订单(Order) User中 添加属性: private Set<Order> orderSet; 在get方法上添加: @OneToMany 参数: cascade 级联操作 CascadeType.REFRESH 级联刷新(只在使用em.refresh方法时有效) CascadeType.PERSIST 级联插入(只在使用em.persist方法时有效) CascadeType.MERGE 级联更新(只在使用em.merge方法时有效) CascadeType.REMOVE 级联删除(只在使用em.remove方法时有效) CascadeType.ALL 上面四项之和 fetch 是否延迟加载关联对象 FetchType.EAGER 立即加载 FetchType.LAZY 延迟加载(第一次访问属性时查询) 注意:如果是一对多,则默认值为LAZY,如果是多对一,则默认值为EAGER mappedBy 表明此类为关系被维护端,值为多的一端中的一的一端的引用的属性名称 Order中 添加属性: private User user; 在get方法上添加: @ManyToOne 参数: cascade 级联操作 optional 此属性是否可以为空,值为boolean,默认为true(允许为null) 在get方法上添加: @JoinColumn 参数: name 外键名称 in子句,占位符必须采用参数名的形式,并且参数赋值时必须采用list(数组不管用)
jpa
最新推荐文章于 2023-07-22 21:44:15 发布