背景
EntityManager是JPA中用于增删改查的接口,它的作用相当于一座桥梁,连接内存中的java对象和数据库的数据存储。使用EntityManager中的相关接口对数据库实体进行操作的时候, EntityManager会跟踪实体对象的状态,并决定在特定时刻将对实体的操作映射到数据库操作上面。
EntityManager的核心概念图:
在SpringBoot中创建并使用EntityManager
1. 创建数据库连接源DataSource
参考:SpringBoot配置数据源DataSource_springboot datasource
2. 创建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的相关配置。
3. 测试方法:
@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注解也是会生效的。