SpringBoot配置实体管理器EntityManager

本文介绍了SpringBoot中如何配置和使用EntityManager,它是JPA与数据库交互的接口,负责对象-关系映射的管理。文章详细阐述了EntityManager的核心概念,并展示了在SpringBoot中创建EntityManagerConfig配置类的步骤,以及测试方法中的注意事项,包括@PersistenceContext注解的使用和@Rollback(false)在单元测试中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

EntityManager的核心概念图:


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

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

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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值