java - Spring Data - 数据已加载但未持久化

标签 java spring hibernate spring-data

我是第一次尝试使用 Spring Data。我已经创建了我的存储库接口(interface)供 Spring 实现。我使用 findAll() 方法,效果很好。但是,save()delete() 方法无法按我的预期工作:尽管没有抛出异常,但没有持久化数据。

我尝试通过 Hibernate 代码进行调试,我看到事件 EntityDeleteAction[com.my.test.City#2] 已添加到 ActionQueue,但其 execute() 方法未被调用。我没能找出原因。

你能帮我一下吗?下面是数据库创建代码、java 配置、我的实体和存储库代码:

CREATE TABLE cities(
  id SERIAL PRIMARY KEY,
  name VARCHAR(45) NOT NULL UNIQUE
);
INSERT INTO cities(id, name) VALUES (1, 'Moscow');
INSERT INTO cities(id, name) VALUES (2, 'St.Petersburg');

城市.java

@Entity
@Table(name = "cities")
public class City {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;
    public String name;
}

CityRepository.java:

@Repository
public interface CityRepository extends CrudRepository<City, Long> {}

AppConfig.java(部分)

@EnableWebMvc
@Configuration
@ComponentScan(value = ...)
@EnableJpaRepositories("com.my.test.repository")
@Import(value = {
        SecurityConfig.class,
        WebMvcConfig.class
})
@PropertySource("classpath:db.properties")
@EnableTransactionManagement
public class AppConfig extends WebSecurityConfigurerAdapter

@Bean
DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(env.getProperty("db.driver"));
    dataSource.setUrl(env.getProperty("db.url"));
    dataSource.setUsername(env.getProperty("db.username"));
    dataSource.setPassword(env.getProperty("db.password"));
    return dataSource;
}

@Bean
SessionFactory sessionFactory() {
    LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource());
    sessionBuilder.scanPackages("com.my.test");
    sessionBuilder.addProperties(getHibernateProperties());
    return sessionBuilder.buildSessionFactory();
}

@Bean
PlatformTransactionManager transactionManager() {
    return new HibernateTransactionManager(sessionFactory());
}

@Bean
LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan(
            "com.my.test.repository",
            "com.my.test.entity"
    );
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    return em;
}

private Properties getHibernateProperties() {
    Properties properties = new Properties();
    properties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
    properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
    return properties;
}

我执行的方法:

cityRepository.delete(2);

感谢您的帮助!

最佳答案

正如 M. Deinum 所写,问题出在不正确的事务管理器中。这就是解决方案:

删除bean sessionFactory()

替换 bean :

@Bean
public JpaTransactionManager transactionManager() {
    return new JpaTransactionManager(entityManagerFactory().getObject());
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPersistenceProviderClass(HibernatePersistenceProvider.class);
    em.setPackagesToScan(
            "com.my.test.repository",
            "com.my.test.entity"
    );
    em.setJpaProperties(getHibernateProperties());
    return em;
}

关于java - Spring Data - 数据已加载但未持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43547103/

相关文章:

java - 我想使用增强的 for 循环,从用户那里获取输入并找到数组中的元素,为什么这个程序没有相应地运行?

java - Junit 测试中没有错误类型的合格 bean

java - 将新模块添加到正在运行的应用程序 NetBeans Platform

java - 如何在 Spring 的一个 ConstraintValidator 中同时验证 @PathVariable 和 @RequestBody?

java - JPA 中的参数化查询出现 "org.hibernate.QueryException: Unable to resolve path..."错误

java - 如何获取属于一项调查的所有问题?

java - 延迟获取数据时出现异常 - JUnit 测试

java - 带文字的自定义市场、Google map

java - Transactional(readOnly=false) 仅在从 Servlet 调用时起作用

java - Mockito 使用时抛出 NPE