JPA-helloWorld

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();回滚

            

原文地址:https://www.cnblogs.com/feifeiyun/p/6900436.html