演示代码: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&amp;characterEncoding=UTF-8&amp;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清除提交时间
posted @ 2021-05-11 11:30  Galaxywang  阅读(112)  评论(0)    收藏  举报