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、主键生成
3、DDL自动更新
DDL更新策略
3.1、使用
3.1.1、create
<!-- JPA更新策略 -->
<property name="hibernate.hbm2ddl.auto" value="create"/>
3.1.2、update
修改实体类: 添加教师
修改配置文件-更新策略为update
排除属性