SpringBoot配置实体管理器EntityManager

文章介绍了在SpringBoot中如何配置和使用EntityManager进行数据库操作,包括创建DataSource,配置EntityManagerFactory和TransactionManager,以及在测试方法中的使用示例,特别提到了@PersistenceContext和@Transactional注解的作用。

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

背景 

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注解也是会生效的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值