繁体   English   中英

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

[英]Spring data JPA repositories not saving to database

我试图在不使用@EnableJpaRepositories批注和spring自动@EnableJpaRepositories情况下初始化spring-data存储库。 在我现有的应用程序中,我可以访问要用于数据库通信的DataSource对象。 以下代码生成TravelAlertRepository的实现,并读取数据库中的现有行。 但是,每当我尝试更新时,这些更改都不会显示在数据库中。 我也无法在数据库中创建新行。

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;
}
}

任何帮助表示赞赏。

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

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

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

检查本文http://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate

并阅读该部分:

从一开始就必须了解所有方法(持久,保存,更新,合并,saveOrUpdate)不会立即导致相应的SQL UPDATE或INSERT语句,这一点很重要。 将数据实际保存到数据库是在落实事务或刷新会话时发生的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM