演示代码:demo-jpa
1. 创建基础项目结构
数据操作
~/demo-jpa/src/main/java/com/noon/jpa/helloworld/Customer.java
package com.noon.jpa.helloworld;
import javax.persistence.*;
@Table(name = "JPA_CUSTOMERS") // 生成一张表名称
@Entity
public class Customer {
private Integer id;
private String lastName;
private String email;
private int age;
@Column(name = "ID") // 列名,是否与字段名一样?
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
public Integer getId() {// 注解需要添加到 get* 语句上面
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 this.email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
2. 添加数据库驱动 + 配置jpa: src/main/resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
version="2.2">
<persistence-unit name="demo-jpa" transaction-type="RESOURCE_LOCAL">
<!-- 配置使用什么 ORM 作为 jpa 的实现:
1. 实际上配置的是 javax.persistence.a?pi.PersistenceProvider 接口的实现类
2. 若 jpa 项目中只有一个 jpa 的实现产品,则也可以不配置该节点
-->
<!-- <provider>org.hibernate.ejb.??不存在HibernatePersistence</provider>-->
<!-- 添加持久类 -->
<class>com.noon.jpa.helloworld.Customer</class>
<properties>
<!-- 连接数据库的基本信息 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://【你的mysql数据库服务器】:3306/demo_jpa_db?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="root@******" />
<!-- 配置 JPA 实现产品的基本属性,实质就是配置 hibernate 的基本属性 -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
3. 运行 Main.java 则可成功插入数据
package com.noon.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 = "demo-jpa";
EntityManagerFactory demoJpaEntityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
// 2. 创建 EntityManager
EntityManager demoJpaEntityManager = demoJpaEntityManagerFactory.createEntityManager();
// 3. 开启事务
EntityTransaction transaction = demoJpaEntityManager.getTransaction();
transaction.begin();
// 4. 进行持久化操作
Customer customer = new Customer();
customer.setAge(33);
customer.setEmail("wangyinhe@service.ccc");
customer.setLastName("yinhe");
demoJpaEntityManager.persist(customer);
// 5. 提交事务
transaction.commit();
// 6. 关闭 EntityManager
demoJpaEntityManager.close();
// 7. 关闭 EntityManagerFactory
demoJpaEntityManagerFactory.close();
}
}
4. exit状态为0表示成功
5. 查看database连接
小结
运行 Main.java 文件,即可向远程连接的 mysql 服务器内的 demo_jpa_db 库,创建、插入数据表:JPA_CUSTOMERS
transaction-type 属性
persistence.xml 不同的事务类型属性,transaction-type="JTA"和之间有什么区别transaction-type=”RESOURCE_LOCAL”?
在JavaEE环境中,默认值为 JTA ;在JavaSE环境中,默认值为 RESOURCE_LOCAL
RESOURCE_LOCAL
负责EntityManager(PersistenceContext/Cache)创建和跟踪:
- 您必须使用EntityManagerFactory来获得EntityManager
- 结果EntityManager实例为PersistenceContext/Cache An,EntityManagerFactory只能通过@PersistenceUnit注释注入(不能通过@PersistenceContext)
- 不允许使用@PersistenceContext引用类型的单位RESOURCE_LOCAL
- 您必须使用EntityTransactionAPI来开始/提交对您的每次调用的请求EntityManger
- 调用entityManagerFactory.createEntityManager()两次将导致两个单独的EntityManager实例,因此产生两个单独的PersistenceContexts/Caches。
- 拥有一个以上EntityManager正在使用的实例几乎从来不是一个好主意(除非已销毁了第一个实例,否则不要创建第二个实例)
JPA
使用
容器将 EntityManager(PersistenceContext/Cache) 创建和跟踪:
- 您不能使用EntityManagerFactory来获得EntityManager
- 您只能得到EntityManager集装箱提供的
- 一个EntityManager可以通过被注入@PersistenceContext注解只有(未@PersistenceUnit)
- 不允许使用@PersistenceUnit引用JTA类型的单元
- 在EntityManager由容器给出的到一个参考PersistenceContext/Cache与JTA事务相关联。
- 如果没有正在进行的JTA事务,则EntityManager因为没有,所以不能使用PersistenceContext/Cache
- EntityManager在同一笔交易中引用相同单位的每个人都将自动引用相同的PersistenceContext/Cache
- 在PersistenceContext/Cache刷新和JTA清除提交时间

浙公网安备 33010602011771号