SpringBoot配置实体管理器EntityManager

EntityManager是JPA中用于增删改查的接口,它的作用相当于一座桥梁,连接内存中的java对象和数据库的数据存储。使用EntityManager中的相关接口对数据库实体进行操作的时候, EntityManager会跟踪实体对象的状态,并决定在特定时刻将对实体的操作映射到数据库操作上面。

EntityManager的核心概念图:

SpringBoot配置实体管理器EntityManager_第1张图片

下面是如何在SpringBoot中创建并使用EntityManager

首先需要创建一个数据库链接源DataSource,创建方式可参考我的上一篇博文

https://blog.csdn.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注解也是会生效的。


你可能感兴趣的:(EntityManager,springboot,EntityManager)