jpa
来源:互联网 发布:刷直通车淘宝抓吗 编辑:程序博客网 时间:2024/05/16 12:37
概述 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(数组不管用)
0 0