如何使用Spring JPA Thread安全?

时间:2019-10-08 06:25:16

标签: multithreading hibernate jpa spring-data-jpa thread-safety

我将jpa与Spring配合使用,配置如下:

accept()

我有一个DAO,它按如下方式注入实体管理器:

@Configuration
public class JPAConfiguration
{
    protected static final String PERSISTENCE_UNIT_NAME = "persistenceUnit";

    @Autowired
    private DatabaseConfigurationProperties databaseConfigurationProperties;

    @Bean
    public JpaTransactionManager createJPATransactionManager(EntityManagerFactory emf)
    {
        JpaTransactionManager jtManager = new JpaTransactionManager();
        jtManager.setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
        jtManager.setEntityManagerFactory(emf);
        return jtManager;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean createEntityManagerFactoryBean(DataSource dataSource)
    {
        LocalContainerEntityManagerFactoryBean lcemfb = new LocalContainerEntityManagerFactoryBean();
        lcemfb.setDataSource(dataSource);
        lcemfb.setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
        lcemfb.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        lcemfb.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
        return lcemfb;
    }

    @Bean
    public DataSource getDataSource()
    {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(databaseConfigurationProperties.getDriver());
        dataSource.setUrl(databaseConfigurationProperties.getUrl());
        dataSource.setUsername(databaseConfigurationProperties.getUser());
        dataSource.setPassword(databaseConfigurationProperties.getPassword());
        return dataSource;
    }
}

以某种方式,当我在线程中使用此DAO时,entitymanager的数据不同步。在线程A中,我保留一个实体。之后,我尝试在线程B中读取它,但它不存在(即使我在线程A上进行了刷新)。对于事务处理,我使用spring @Transactional批注。

使用hibternate线程安全的spring jpa的正确方法是什么?我读了很多教程,但它们都使用与我相同的代码。

非常感谢。

0 个答案:

没有答案