Spring数据JPA存储库未保存到数据库

时间:2018-04-24 09:04:47

标签: java mysql spring spring-data spring-data-jpa

我试图在不使用@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;
}
}

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

使用存储库时,它可以在某种休眠缓存状态下工作,因此使用save()实际上并不会将对象保存到数据库中。它在hibernate中将其标记为需要保存的对象。

如果你调用实体管理器的flush()方法,它会将对象发送到数据库,但它仍然不会提交!因此,您将能够在数据库中找到它,但仅限于使用相同的数据库连接。

要在数据库中查看结果,您需要提交事务。 (默认情况下,Hibernate在将数据发送到数据库之前一直等到结束)。尝试为实体管理器调用事务的commit()方法 - em.getTransaction().commit();

查看此文章http://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate

阅读那部分:

  

重要的是要从一开始就明白所有的   方法(持久,保存,更新,合并,saveOrUpdate)不   立即导致相应的SQL UPDATE或INSERT   声明。实际将数据保存到数据库中   提交交易或刷新会话。