(一)JPA的快速入门

2、JPA连接工厂

        // 创建JPA Entity工厂
        EntityManagerFactory factory =
                Persistence.createEntityManagerFactory("YootkJPA");
        // JPA操作对象
        EntityManager entityManager = factory.createEntityManager();

所以此时可以考虑将部分的代码移交给JPA的专属连接管理类,用这个类可以基于ThreadLocal实现EntityManager存储,这样每一次通过该类的方法获取EntityManager的时候如果不关闭,则获取到的是同一个实例

public class JPAEntityFactory {
    /**
     * JPA持久单元
     */
    private static final String PERSISTENCE_UNIT = "YootkJPA";
    /**
     * 等同于 数据源
     */
    private static EntityManagerFactory entityManagerFactory;
    /**
     * EntityManager 等同于 连接
     */
    private static ThreadLocal<EntityManager> entityManagerThreadLocal =
            new ThreadLocal<>();

    static {
        // 初始化创建数据源 静态代码块只会创建一次
        rebuildEntityManagerFactory();
    }
    
    /**
     * 获取连接
     */
    public static EntityManager getEntityManager() {
        // 本机线程获取连接
        EntityManager entityManager = entityManagerThreadLocal.get();
        if (entityManager == null) {
            // 从数据源获取新的连接
            entityManager = getEntityManagerFactory().createEntityManager();
            // 存入本地线程
            entityManagerThreadLocal.set(entityManager);
        }
        return entityManager;
    }
    
    private static EntityManagerFactory getEntityManagerFactory() {
        if (entityManagerFactory == null) {
            // 创建数据源
            rebuildEntityManagerFactory();
        }
        return entityManagerFactory;
    }
    
    private static void rebuildEntityManagerFactory() {
        // 持久单元 创建 数据源
        entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
    }
    
    /**
     * 关闭EntityManager
     */
    public static void close() {
        // 获取实例
        EntityManager entityManager = entityManagerThreadLocal.get();
        if (entityManager != null) {
            // 关闭连接  entityManager类似于Connection
            entityManager.close();
            // 删除本地线程中的连接
            entityManagerThreadLocal.remove();
        }
    }
}

修改测试类:

    @Test
    public void testAdd2() {
        // 获取连接
        EntityManager entityManager = JPAEntityFactory.getEntityManager();
        // 开启事务
        entityManager.getTransaction().begin();
        Course course = new Course();
        course.setCname("Spring编程实战");
        // 字符串 日期对象
        course.setStart(DateUtil.stringToDate("2022-09-19"));
        course.setEnd(DateUtil.stringToDate("2022-12-30"));
        course.setCredit(2);
        course.setNum(88);
        // 执行插入
        entityManager.persist(course);
        // 提交事务
        entityManager.getTransaction().commit();
        // 关闭连接
        JPAEntityFactory.close();
    }

3、主键生成

(二)JPA 连接工厂、主键生成策略、DDL自动更新-LMLPHP

3、DDL自动更新

(二)JPA 连接工厂、主键生成策略、DDL自动更新-LMLPHP

DDL更新策略

(二)JPA 连接工厂、主键生成策略、DDL自动更新-LMLPHP

3.1、使用

3.1.1、create
            <!-- JPA更新策略 -->
            <property name="hibernate.hbm2ddl.auto" value="create"/>

(二)JPA 连接工厂、主键生成策略、DDL自动更新-LMLPHP

3.1.2、update

修改实体类: 添加教师

(二)JPA 连接工厂、主键生成策略、DDL自动更新-LMLPHP

修改配置文件-更新策略为update

(二)JPA 连接工厂、主键生成策略、DDL自动更新-LMLPHP

排除属性

(二)JPA 连接工厂、主键生成策略、DDL自动更新-LMLPHP

09-24 11:02