[英]Saving entity in repository does not work SPRING
我正在嘗試在存儲庫中保存實體,但它根本不起作用。 存儲庫是自動裝配的,在運行時我使用saveAndFlush來保存實體。 我正在使用PostgreSQL。 在上面的測試方法中,我添加了評論並解釋了發生了什么。 我期望saveAndFlush方法可以工作,但它沒有。 我找不到原因。
@Transactional
public class TestClass{
@Autowired private MyRepository repository;
@Autowired private EntityManager entityManager;
// Working version
public void writingToRepositoryWorking() {
entityManager.getTransaction().begin();
entityManager.persist(new MyData(99));
entityManager.getTransaction().commit();
}
// not working and throws exception :
// TransactionRequiredException: no transaction is in progress
public void writingToRepositoryNotWorking() {
repository.saveAndFlush(new MyData(99));
}
// not working, no exception, no data in repository,
// but auto generated ID is incremented
public void writingToRepositoryNotWorkingToo() {
repository.save(new MyData(99));
}
}
存儲庫接口文件
@Repository
@Transactional
public interface MyRepository extends JpaRepository<MyData, Long> {}
MyData文件
@Entity(name = "myData")
public class MyData {
@Id @GeneratedValue(strategy = GenerationType.AUTO) long id;
private int testValue;
public MyData() { }
public BugData(int testValue) {
this.testValue = testValue;
}
public long getId() {
return id;
}
public int getTestValue() {
return testValue;
}
}
ApplicationConfiguration文件
@Configuration
@EnableJpaRepositories("com.mypackage.app")
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
@EnableWebMvc
class ApplicationConfiguration extends WebMvcConfigurationSupport {
@Value("${jdbc.url}") private String KEY_JDBC_URL;
@Value("${jdbc.username}") private String KEY_JDBC_USERNAME;
@Value("${jdbc.password}") private String KEY_JDBC_PASSWORD;
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean
@Autowired
public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setPackagesToScan("com.mypackage.app");
factory.setHibernateProperties(hibernateProperties());
return factory;
}
public Properties hibernateProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.hbm2ddl.auto", "update");
return properties;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
return new HibernateTransactionManager(sessionFactory);
}
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl(KEY_JDBC_URL);
dataSource.setUsername(KEY_JDBC_USERNAME);
dataSource.setPassword(KEY_JDBC_PASSWORD);
return dataSource;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("com.mypackage.app");
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
em.setJpaProperties(hibernateProperties());
em.afterPropertiesSet();
return em.getObject();
}
@Bean
public EntityManager entityManager(EntityManagerFactory entityManagerFactory) {
return entityManagerFactory.createEntityManager();
}
...
}
對於初學者,您實際上在非工作測試用例中處理2個不同的EntityManager
:
EntityManager
自動連接到您的測試由Spring(這個人是獨立的,並無論如何都應該避免),另一種是 EntityManager
創建的EntityManagerFactory
。 同時,由於您配置了Hibernate SessionFactory
,您還可以在前面提到的2個EntityManagers
旁邊運行另一個Session。 另外,由於配置了HibernateTransactionManager
,由@Transactional
創建的所有事務都綁定到由SessionFactory
創建的Hibernate會話,並且您的Repository使用的EntityManager
當然無法知道它。 這就是當您的存儲庫嘗試保留數據時拋出TransactionRequiredException
原因。
要修復它, 您可以考慮刪除Hibernate的SessionFactory
並將事務管理器切換到JpaTransactionManager
。 然后,您的Repository上的@Transactional
將具有創建新事務並將其綁定到Spring已知的現有EntityManager
的效果。
一方面注意,TestClass上的@Transactional
根本沒有幫助,因為Spring沒有實例化和管理此類的實例。 為了使其工作,需要提供正確的事務測試類配置,如下所述: http : //docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html 。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.