一、JPA_HelloWorld
- 点击persistence.xml的Connection选项
JTA是支持分布式的事务类型,这里由于只需要使用本地数据库,因此把事务类型改为resource local,下面也显示了数据库的配置信息给我们填写:
这里URL的数据库选择为jpa,同时本地建一个名为jpa的mysql数据库:
此时再回到source,这些信息已配置好:
(由于要用到Hibernate,这里附上多个版本的下载地址:https://sourceforge.net/projects/hibernate/files/)
- 该文件的初步配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
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_2_0.xsd">
<persistence-unit name="jpa-1" transaction-type="RESOURCE_LOCAL">
<!-- 配置使用什么ORM产品作为JPA的实现
1. 实际上配置的是javax.persistence.spi.PersistenceProvider接口的实现类
2. 若JPA项目中只有一个JPA的实现产品,则也可以不配置该节点
-->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<!-- 配置 JPA 实现产品的基本属性(这里配置Hibernate的基本属性) -->
<!-- 格式化sql -->
<property name="hibernate.format_sql" value="true"/>
<!-- 显示sql在控制台 -->
<property name="hibernate.show_sql" value="true"/>
<!-- 生成数据表的策略 -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
- 接着新建Customer.java实体类
package com.zyuxuan.jpa.helloworld;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name="JPA_CUSTOMERS")
@Entity
public class Customer {
private Integer id;
private String lastName;
private String email;
private int age;
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="LAST_NAME")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 然后在persistence.xml中添加实体类的配置:
<!-- 添加持久化类 -->
<class>com.zyuxuan.jpa.helloworld.Customer</class>
- 再编写一个Main类:
package com.zyuxuan.jpa.helloworld;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class Main {
public static void main(String[] args) {
//1.创建 EntityManagerFactory
String persistenceUnitName="jpa-1";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);
//2.创建EntityManager
EntityManager manager=factory.createEntityManager();
//3.开启事务
EntityTransaction transaction = manager.getTransaction();
transaction.begin();
//4.持久化操作
Customer c=new Customer();
c.setAge(10);
c.setEmail("666@qq.com");
c.setLastName("Jack");
manager.persist(c);
//5.提交事务
transaction.commit();
//6.关闭EntityManager
manager.close();
//7.关闭EntityManagerFactory
factory.close();
}
}
运行main方法,控制台输出语句:
这时查看数据库,发现表已经自动生成,且数据已插入:
注意persistence.xml的位置是固定的:
二、JPA基本注解
1、六个基本注解
(1)@Entity
(2)@Table
与@Entity配合使用
(3)@Id
(4)@GeneratedValue
(5)@Basic
(6)@Column
2.@Transient
3.@Temporal
4.用table来生成主键详解
为测试该功能,先新建一张用于存主键值的表:
然后往表中插入数据:
三、JPA API
1、Persistence
第二个重载的方法中的properties的键必须是Persistence.xml的properties配置中出现过的name的内容,例如hibernate.show_sql
2.EntityManagerFactory
(1)EntityManager#find
①类似于Hibernate中session的get方法
②调用find方法后立刻已经发了select
(2)EntityManager#getReference
①类似于Hibernate中session的load方法
②调用getReference方法后不会立刻发送select,而是暂时返回一个代理对象,当要使用对象时才会发送select
(3)EntityManager#persist