[英]Could not open JPA EntityManager for transaction (using LocalContainerEntityManagerFactoryBean)
我在測試時看到了這個。 我確信數據庫連接正在建立(或嘗試),因為它在我沒有包含密碼時最初發出錯誤,然后它抱怨因為該名稱的數據庫不存在。 一旦我創建了數據庫,它就給了我這個錯誤:
$ mvn clean test
...
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.317 sec <<< FAILURE!
testGetAccounts(com.oreilly.repositories.JpaAccountRepositoryTest) Time elapsed: 0.104 sec <<< ERROR!
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Lorg/hibernate/FlushMode;
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
at org.springframework.test.context.transaction.TransactionContext.startTransaction(TransactionContext.java:98)
...
以下是我的配置文件:
@Configuration
@ComponentScan(basePackages = "com.oreilly")
@PropertySource("classpath:prod.properties")
@EnableTransactionManagement
public class AppConfig {
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.url"));
dataSource.setUsername(env.getProperty("db.user"));
dataSource.setPassword(env.getProperty("db.pass"));
return dataSource;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setShowSql(true);
adapter.setGenerateDdl(true);
adapter.setDatabase(Database.MYSQL);
return adapter;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
Properties props = new Properties();
props.setProperty("hibernate.format_sql", String.valueOf(true));
LocalContainerEntityManagerFactoryBean emf =
new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource);
emf.setPackagesToScan("com.oreilly.entities");
emf.setJpaVendorAdapter(jpaVendorAdapter);
emf.setJpaProperties(props);
return emf;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
@Bean
public BeanPostProcessor persistenceTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
如果它有幫助,很高興包含更多代碼。 我可以使用相同的憑據成功登錄到我的mysql控制台,數據庫在那里:
$ mysql -uroot -p spring
Enter password:
...
mysql> show databases;
+-----------------------+
| Database |
+-----------------------+
| ... |
| spring |
+-----------------------+
10 rows in set (0.00 sec)
我正在關注一個野生動物園書籍視頻課程,這對JPA來說非常新鮮。 幾乎只是采取了他們的代碼仍然得到錯誤,所以很難知道我應該質疑哪部分代碼。
UPDATE
這是我正在運行的測試。 我現在正在運行一個測試,否則我的控制台會遇到錯誤。 我也將在下面添加存儲庫代碼:
JpaAccountRepositoryTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
@Transactional
public class JpaAccountRepositoryTest {
@Autowired
private AccountRepository repository;
@Test
public void testGetAccounts() throws Exception {
List<Account> accounts = repository.getAccounts();
assertThat(accounts.size(), is(3));
}
// @Test
// public void testGetAccount() throws Exception {
// ...
JpaAccountRepository.java
@Repository
public class JpaAccountRepository implements AccountRepository {
private long nextId = 4;
@PersistenceContext
private EntityManager entityManager;
public List<Account> getAccounts() {
return entityManager.createQuery("select a from Account a", Account.class)
.getResultList();
}
public Account getAccount(Long id) {
...
Spring JpaTransactionManager需要一些其他版本的Hibernate,因為Session.getFlushMode()似乎缺失了。
根據這個答案,如果您使用的是舊版本的Spring,他們建議將Hibernate降級為hibernate-core-5.1.0.Final.jar。
檢查你的依賴圖,看看是否有什么東西覆蓋了Hibernate版本。
為什么在測試類中使用@Transaction
。 使用可以使用@DataJpaTest
或@SpringBootTest
注釋,大多數情況下更喜歡@DataJpaTest.
此問題看起來像Jar沖突。 您可以嘗試降級到hibernate-core-5.1.0。 如果沒有,請使用maven-enforcer插件創建依賴關系收斂分析,以確保您沒有與傳遞依賴關系發生沖突。
更換
@Autowired
private AccountRepository repository;
同
@Autowired
private JpaAccountRepository repository;
在您的JpaAccountRepositoryTest類中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.