JPA
1.JPA 是java对象的持久化的API
2.javaEE 5.0标准的ORM规范,让应用程序进行统一的一种方式来进行访问
持久化的数据
3.之前是java程序之间进行调用ORM框架,但是ORM框架特别的多,每个ORM框架的实现都是不一样 那么程序员开发特别的繁琐,
sun公司提供了一套标准(JPA) ,让程序员来进行使用这套JPA的规范
那么不同的ORM框架需要对应的实现,那么这些实现就是对应的厂商来进行提供实现
优点
标准化
简单易用,便于集成
支持编写对象的高级特性
技术点
ORM 映射的元数据
jpa的API
JPQL
通过面向对象而非面向数据库的查询语句
https://jcp.org/aboutJava/communityprocess/mrel/jsr338/index.html

入门
配置
<persistence version="2&#46;0" xmlns="http&#58;&#47;&#47;java&#46;sun&#46;com&#47;xml&#47;ns&#47;persistence">

<persistence-unit name="jpa&#45;01" transaction&#45;type="RESOURCE&#95;LOCAL">

<class>com.java.jpa.Users</class>
<properties>






</properties></persistence-unit></persistence>

         <property name="hibernate.hbm2ddl.auto" value="update" />

         <!--显示sql-->
         <property name="hibernate.show_sql" value="true" />
         <!--格式化sql-->
         <property name="hibernate.format_sql"  value="true" />

     </properties>
   </persistence-unit>

实体类
@Table(name = "JPA_USERS")
//指定持久化类
@Entity
public class Users {
/**

 */
 private  Integer     id ;

 /**

 */
 private  String    name ;

 /**

 */
 private  Integer     age ;

 /**

 */
 private  String    lovel;

 @Id//主键
 //进行配置主键的生成的策略
 @GeneratedValue(strategy = GenerationType.IDENTITY) //设置为只增
 public Integer getId() {
     return id;
 }

//指定数据库的表名称
@Table(name = "JPA_USERS")
//指定持久化类
@Entity
//与@Table(name = "JPA_USERS") 类似,生成多表
//@SecondaryTable(name = "JPA_USERS_TABLE")
/**

  • @Access(AccessType.FIELD) 通过反射的方式

  • @Access(AccessType.PROPERTY) 通过实体类的get set 方法来进行映射

  • /
    //@Access(AccessType.PROPERTY)
    public class Users {
    /**

    */
    // private Integer id ;
    private String id ;

 private  String    name ;


 private  Integer     age ;


 private  String    lovel;
 private Date  startDate;

 @Id
 @GeneratedValue(generator = "uuid-hex") //设置为字符串
 @GenericGenerator(name="uuid-hex",strategy = "uuid")
 @Column(length = 32)
 public String getId() {
     return id;
 }

 public void setId(String id) {
     this.id = id;
 }


 //进行配置主键的生成的策略
 /**
  * GenerationType.TABLE  通过表来进行生成
  * GenerationType.IDENTITY  自增
  *  GenerationType.AUTO  根据数据库的默认生成策略
  *  其他生成策略
  *  UUID
  */

/* @Id//主键
// @GeneratedValue(strategy = GenerationType.IDENTITY) //设置为只增
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}/
/*

* 设置时间的
* 年月日
* 时分秒
* TemporalType.TIMESTAMP 年月日 时分秒
* TemporalType.DATE 年月日
* TemporalType.TIME 时分秒
* ....
* @return
*/
@Temporal(TemporalType.TIME)
public Date getStartDate() {
return startDate;
}

 public void setStartDate(Date startDate) {
     this.startDate = startDate;
 }



 public String getName() {
     return name;
 }
 /**
  一个简单的属性到数据库中的映射
  对应没有任何标注的get xx方法默认的就是该注解
  fetch  表示该属性的读取策略,   FetchType.EAGER  抓取 、 FetchType.LAZY  懒加载/延迟加载
  optional = false   表示是否允许为空null  默认为true

  */
 @Basic(fetch = FetchType.LAZY,optional = false)
 public void setName(String name) {
     this.name = name;
 }

 /**
  当属性名称和表字段不一样的时候
  就可以进行使用该注解

  */
 @Column(name = "last_age",length = 50,nullable = false)
 public Integer getAge() {
     return age;
 }

 public void setAge(Integer age) {
     this.age = age;
 }

 /**
  * 如果一个属性不要在数据库表中映射
  * @return
  */
 @Transient
 public String getLovel() {
     return lovel;
 }

 public void setLovel(String lovel) {
     this.lovel = lovel;
 }

}

单向多对一的关联关系
package com.java.bo;

import com.sun.corba.se.impl.interceptors.PICurrent;

import javax.persistence.*;

@Table(name = "JPA_ORDERS")
@Entity
public class Ordres {

private Integer id ;

private String name ;

private   Person  person;

/**
 *    映射单向的  N-1
 *      使用注解    @ManyToOne  来进行映射
 *      指定外键的名称
 * @return
 */
@JoinColumn(name = "person_pid")
//进行设置懒加载
@ManyToOne(fetch = FetchType.LAZY)
public Person getPerson() {
    return person;
}

public void setPerson(Person person) {
    this.person = person;
}

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)
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;
}

}

@Table(name = "JPA_PERSON")
@Entity
public class Person {

private  Integer     pid ;

private  String    pname ;
private Date  date;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getPid() {
    return pid;
}


@Temporal(TemporalType.DATE)
public Date getDate() {
    return date;
}

public void setDate(Date date) {
    this.date = date;
}

public void setPid(Integer pid) {
    this.pid = pid;
}

public String getPname() {
    return pname;
}

public void setPname(String pname) {
    this.pname = pname;
}

}


单向一对多

@Table(name = "JPA_DOG")
@Entity
public class Dog {

/**

*/
private  Integer     id ;


/**

*/
private  String    name;

private List<DogFood>  dogFoods=new ArrayList<>();

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
    return id;
}

@JoinColumn(name = "food_id")
@OneToMany
public List<DogFood> getDogFoods() {
    return dogFoods;
}

public void setDogFoods(List<DogFood> dogFoods) {
    this.dogFoods = dogFoods;
}

public void setId(Integer id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

@Table(name = "JPA_DOGFOOD")
@Entity
public class DogFood {

/**

*/
private  Integer     id ;
/**

*/
private  String     name ;



@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
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;
}

}

================================
双向一对多
//指定数据库的表名称
@Table(name = "JPA_ORDERS3")
//指定持久化类
@Entity
public class Orders3 {
private Integer id ;

private  String    name ;

private List<Person3> Person3=new ArrayList<>();

@OneToMany(mappedBy ="orders3" )
public List<Person3> getPerson3() {
    return Person3;
}

public void setPerson3(List<Person3> person3) {
    Person3 = person3;
}

/**
 *    映射单向的  N-1
 *      使用注解    @ManyToOne  来进行映射
 *      指定外键的名称
 * @return
 */


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
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;
}

}

//指定数据库的表名称
@Table(name = "JPA_PERSON3")
//指定持久化类
@Entity
public class Person3 {
private Integer pid ;
private String pname ;
private Date date;

private Orders3 orders3;
@JoinColumn(name = "person3_pid")
//进行设置懒加载
@ManyToOne(fetch = FetchType.LAZY)
public Orders3 getOrders3() {
    return orders3;
}

public void setOrders3(Orders3 orders3) {
    this.orders3 = orders3;
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getPid() {
    return pid;
}

public void setPid(Integer pid) {
    this.pid = pid;
}

public String getPname() {
    return pname;
}

public void setPname(String pname) {
    this.pname = pname;
}
@Temporal(TemporalType.DATE)
public Date getDate() {
    return date;
}

public void setDate(Date date) {
    this.date = date;
}

}

---------测试
/**
*
*/
@Test
public void getVoid(){
//获取EntityManager对象
EntityManager entityManager = JPA_Util.getEntityManager();
//创建事务对象
EntityTransaction transaction = entityManager.getTransaction();
//开启事务
transaction.begin();

    Person3 person = new Person3();
    person.setPname("海绵宝宝");
    person.setDate(new Date());
    Person3 person2 = new Person3();
    person2.setPname("派大星");
    person2.setDate(new Date());

    Orders3 orders = new Orders3();
    orders.setName("双十一订单");
    Orders3 orders2 = new Orders3();
    orders2.setName("双十二订单");


    //进行设置关联关系
    person.setOrders3(orders);
    person2.setOrders3(orders2);



    //执行操作
    entityManager.persist(person);
    entityManager.persist(person2);
    entityManager.persist(orders);
    entityManager.persist(orders2);



    //提交事务
    transaction.commit();
    //关闭
    JPA_Util.getClose();
}