我试图在不使用@EnableJpaRepositories
注释和弹簧自动装配的情况下初始化spring-data存储库。在我现有的应用程序中,我可以访问要用于数据库通信的DataSource
对象。以下代码为TravelAlertRepository
生成实现并读取DB中的现有行。但是,每当我尝试更新时,这些更改都不会显示在数据库中。我也无法在数据库中创建新行。
interface TravelAlertRepository extends
org.springframework.data.repository.CrudRepository<TravelAlertVO, Long>{}
class SpringDataRepositories {
private TravelAlertRepository travelAlertRepository;
private javax.persistence.EntityManager entityManager;
SpringDataRepositories() {
this.entityManager = createEntityManager();
RepositoryFactorySupport factory = new JpaRepositoryFactory(entityManager);
travelAlertRepository = factory.getRepository(TravelAlertRepository.class);
}
private static javax.persistence.EntityManager createEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPersistenceProviderClass(HibernatePersistenceProvider.class);
em.setJpaProperties(hibProperties());
em.setPersistenceUnitName("persistentName");
em.setPackagesToScan(
TravelAlertVO.class.getPackage().getName()
);
em.afterPropertiesSet();
return em.getObject().createEntityManager();
}
private static Properties hibProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
properties.put("hibernate.show_sql", true);
return properties;
}
public static DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("mydb");
dataSource.setPassword("mydb");
return dataSource;
}
}
任何帮助表示感谢。
答案 0 :(得分:0)
使用存储库时,它可以在某种休眠缓存状态下工作,因此使用save()实际上并不会将对象保存到数据库中。它在hibernate中将其标记为需要保存的对象。
如果你调用实体管理器的flush()方法,它会将对象发送到数据库,但它仍然不会提交!因此,您将能够在数据库中找到它,但仅限于使用相同的数据库连接。
要在数据库中查看结果,您需要提交事务。 (默认情况下,Hibernate在将数据发送到数据库之前一直等到结束)。尝试为实体管理器调用事务的commit()方法 - em.getTransaction().commit();
查看此文章http://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate
阅读那部分:
重要的是要从一开始就明白所有的 方法(持久,保存,更新,合并,saveOrUpdate)不 立即导致相应的SQL UPDATE或INSERT 声明。实际将数据保存到数据库中 提交交易或刷新会话。