簡體   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