gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:46:53 25 4
gpt4 key购买 nike

我是第一次尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com