Multithreading 如何使用SpringJPA线程安全?

Multithreading 如何使用SpringJPA线程安全?,multithreading,hibernate,jpa,spring-data-jpa,thread-safety,Multithreading,Hibernate,Jpa,Spring Data Jpa,Thread Safety,我将Spring与jpa一起使用,配置如下: @Configuration public class JPAConfiguration { protected static final String PERSISTENCE_UNIT_NAME = "persistenceUnit"; @Autowired private DatabaseConfigurationProperties databaseConfigurationProperties; @Bean

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

@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;
    }
}
我有一个注入entitymanager的DAO,如下所示:

@PersistenceContext(unitName = "persistenceUnit")
protected EntityManager entityManager;
不知何故,当我在线程中使用此DAO时,entitymanager的数据不同步。在线程A中,我持久化一个实体。之后,我尝试在线程B中读取它,但它不存在(即使我在线程a上执行刷新)。对于事务处理,我使用spring@Transactional注释

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


非常感谢。

我的部分描述可能与您的链接重复。但我正在寻找解决这个问题的正确方法;)好吧,如果一个类不是线程安全的,那么解决方案就是不要跨多个线程使用它。如果您描述了您遇到的实际问题(即,为什么您认为需要跨多个线程跨事务)@crizzis我没有跨多个线程的事务,我在每个线程中都有一个事务。但是完成的事务的数据并没有同步。我不太了解的一件事是以下部分:“在线程A中,我持久化了一个实体。然后我试着在线程B'中阅读它。如果这两个线程并行执行,您如何知道何时会发生什么?如果您提供更多的上下文,包括执行持久化和读取的服务方法,以及线程的创建/执行方式,就会更容易。