SpringBoot配置实体管理器EntityManager
EntityManager是JPA中用于增删改查的接口,它的作用相当于一座桥梁,连接内存中的java对象和数据库的数据存储。使用EntityManager中的相关接口对数据库实体进行操作的时候, EntityManager会跟踪实体对象的状态,并决定在特定时刻将对实体的操作映射到数据库操作上面。
EntityManager的核心概念图:
下面是如何在SpringBoot中创建并使用EntityManager
首先需要创建一个数据库链接源DataSource,创建方式可参考我的上一篇博文
https://blog.****.net/qq_20916555/article/details/80852144
创建EntityManagerConfig配置类,使用springboot注解自动配置EntityManager,具体代码如下:
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManageFactoryPrimary", transactionManagerRef = "transactionManagerPrimary", basePackages = {"com.hope.monsterlan.dao"} ) public class EntityManageConfig { @Autowired @Qualifier("myDataSource") private DataSource myDataSource; @Primary @Bean(name = "entityManagerPrimary") public EntityManager entityManager(EntityManagerFactoryBuilder builder){ return entityManageFactory(builder).getObject().createEntityManager(); } @Primary @Bean(name = "entityManageFactoryPrimary") public LocalContainerEntityManagerFactoryBean entityManageFactory(EntityManagerFactoryBuilder builder){ LocalContainerEntityManagerFactoryBean entityManagerFactory = builder.dataSource(myDataSource) .packages("com.hope.monsterlan.entity").build(); Properties jpaProperties = new Properties(); jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); jpaProperties.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"); jpaProperties.put("hibernate.connection.charSet", "utf-8"); jpaProperties.put("hibernate.show_sql", "false"); entityManagerFactory.setJpaProperties(jpaProperties); return entityManagerFactory; } @Primary @Bean(name = "transactionManagerPrimary") public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManageFactory(builder).getObject()); } }
这里主要利用@Bean注解向IOC容器注入EntityManagerFactory, 然后通过EntityManagerFactory创建EntityManager和JPATransactionManager,这样通过@Autowired @Qualifier @Resource等注解可以使用EntityManager的相关配置。
测试方法:
@PersistenceContext(unitName = "entityManageFactoryPrimary") private EntityManager entityManager; @Test @Rollback(false) @Transactional("transactionManagerPrimary") public void test3(){ Role role = new Role(); role.setRolename("test"); role.setDepartmentid(88); role.setStatus(1); entityManager.merge(role); entityManager.flush(); }
这里需要注意两个地方:
- 使用@PersistenceContext注解创建EntityManager对象,unitName参数传入的是之前配置中EntityManageFactory的别名。Spring通过ByName和ByType的方式从IOC容器中寻找被注入的Bean
- 因为这里使用的是JUnit单元测试,所有需要加上注解@Rollback(false)将自动回滚置为false,否则测试方法会自动回滚,你对数据库进行的修改删除操作都是无效的,当然查询操作不用加@Rollback注解也是会生效的。