1.什么是JPA
全称Java Persistence API,用于对象持久化的API。
JPA与ORM框架(对象关系模型如Hibernate)的关系就如同JDBC与mysql数据库驱动一样,前者是java官方提供的标准(只提供接口),后者是具体厂商的实现类。
学Hibernate时主要使用的是配置的方式;而学JPA主要使用的是注解的方式,也可以看作是学习怎么使用注解的方式使用Hibernate
事实上JPA的始作俑者就是Hibernate的作者。
2.创建一个JPA的helloWorld工程
createJPA工程,jpa版本选择2.0,
创建好的工程目录中带有persistence.xml文件,内容如下:
然后创建实体类,并加入注解
package com.entities; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Table(name = "student_hello")//生成的表名 @Entity//加在类上,声明为实体 public class Student { private Integer id; private String name; private Integer age; @GeneratedValue(strategy = GenerationType.AUTO)//可以定义主键的生成策略为自动,默认是自动 @Id//加在get方法上,表示id属性映射为主键 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() {//get方法前也可以不加注解,那么会默认添加上@basic注解 return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
编写测试方法
package com.test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import com.entities.Student; public class TestHello { public static void main(String[] args) { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa-hello"); EntityManager entityManager = entityManagerFactory.createEntityManager(); EntityTransaction entityTransaction = entityManager.getTransaction(); Student s = new Student(); s.setAge(10); s.setName("ji"); entityTransaction.begin(); entityManager.persist(s); entityTransaction.commit(); entityManager.close(); entityManagerFactory.close(); } }
3.注解
@Entity 在类上添加,表明是一个实体类,这时也可以不加@Table,那么表名就是类名
@Table(name="表名")
@Id 通常加在get方法上,表名该字段为主键
@GeneratedValue(strategy=GenerationType.) 加在主键的get方法上
当使用table的生成策略时
@TableGenerator(name = "student_id", table="jpa_id_generator", pkColumnName = "PK_NAME", pkColumnValue = "STUDENT_ID", allocationSize = 100, //每次存新列的时候,主键相比上一次增加100,jpa_id_generator中的对应PK_VALUE加1 //也可以这样理解,每次加新列时先用jpa_id_generator中的对应PK_VALUE乘allocationSize作为主键,然后PK_VALUE再加1 valueColumnName = "PK_VALUE") // 可以定义主键的生成策略为自动,默认是自动 @GeneratedValue(strategy = GenerationType.TABLE, generator = "student_id") @Id // 加在get方法上,表示id属性映射为主键 public Integer getId() { return id; }
@Basic 若get方法上没加注解那么就相当于加了@Basic,会自动把属性映射到对应的列上,列名就是属性名,长度类型等信息也是默认的
@Column(name="列名",length=50,nullable=false) 长度50不能为空
@Transient 加在get方法上,那么该方法将不会在数据表中生成对应列
@Temporal(TemporalType.DATE/TIME/TIMESTAMP) 加在日期类型的属性的get方法上,那么在数据库中分别存储为日期,时间,时间戳类型
3.常用API
①Persistence 两个静态方法,可以用于去创建EntityManagerFactory
//创建EntityManagerFactory有如下两种方法,对应Persistence的两个方法 // EntityManagerFactory entityManagerFactory = // Persistence.createEntityManagerFactory("jpa-hello");//需要传入<persistence-unit name="jpa-hello" transaction-type="RESOURCE_LOCAL">的名字 Map<String, String> properties = new HashMap<>(); properties.put("hibernate.show_sql", "true"); EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa-hello", properties);//前面是传名字,后面是传创建需要的配置
②EntityManagerFactory .createEntityManager()创建EntityManager
③EntityManager
.getTransaction()得到事务
4个常用API find,getReference,persist,remove
@Test public void testFind() { Student s = entitiyManager.find(Student.class, 1);// 在这里时就查询了,且不需要强转 System.out.println("----------------------"); System.out.println(s); } // 类似于session的load,,reference:参考 @Test public void testGetReference() { Student s = entitiyManager.getReference(Student.class, 1);// 这句完以后,只是一个代理对象 System.out.println(s.getClass().getName());// com.entities.Student_$$_javassist_0 System.out.println("----------------------"); System.out.println(s);// 到这里时才查询 } @Test public void testPersist() { Student s = new Student(); s.setAge(10); s.setName("qq"); // s.setId(222);//若事先加有id那么就会报异常 entitiyManager.persist(s);// 若使用的是table的主键生成方式会在commit时才insert,若是Auto的生成方式会在这句就insert System.out.println(s.getId()); } // 与session.delete的区别是不能删除游离对象 @Test public void testRemove() { // Student s = new Student(); // s.setId(1000);//s就是游离对象 // entitiyManager.remove(s);//会报异常java.lang.IllegalArgumentException entitiyManager.remove(entitiyManager.find(Student.class, 1001));// 在commit时才执行delete语句 System.out.println("------------"); }
entityManager.merge(T entity) 功能类似与session的saveOrUpdate
entityManager.flush() 将缓存中的变化,发送对应的SQL语句,直到事务结束,数据库中数据才会改变。commit()方法中隐藏有这句
其他
查询
④Transaction .begin();开启事务 .commit();提交事务 .rollback();回滚