java – 无法打开JPA EntityManager进行事务处理(使用LocalContainerEntityManagerFactoryBean)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 无法打开JPA EntityManager进行事务处理(使用LocalContainerEntityManagerFactoryBean),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4026字,纯文字阅读大概需要6分钟。
内容图文
![java – 无法打开JPA EntityManager进行事务处理(使用LocalContainerEntityManagerFactoryBean)](/upload/InfoBanner/zyjiaocheng/729/6dcd71b1b59a4ab49ec4a73ed0052163.jpg)
我在测试时看到了这个.我确信数据库连接正在建立(或尝试),因为它在我没有包含密码时最初发出错误,然后它抱怨因为该名称的数据库不存在.一旦我创建了数据库,它就给了我这个错误:
$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()似乎缺失了.
根据this的回答,如果您使用的是旧版本的Spring,他们建议将Hibernate降级为hibernate-core-5.1.0.Final.jar.
检查你的依赖图,看看是否有什么东西覆盖了Hibernate版本.
内容总结
以上是互联网集市为您收集整理的java – 无法打开JPA EntityManager进行事务处理(使用LocalContainerEntityManagerFactoryBean)全部内容,希望文章能够帮你解决java – 无法打开JPA EntityManager进行事务处理(使用LocalContainerEntityManagerFactoryBean)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。