2017-01-24 11 views
2

Spring Data JPA + Hibernate + Microsoft SQL Serverで簡単なJavaプログラムを作成しました。プログラムを実行すると、次の例外が発生し、問題の原因を特定できません。Spring Data JPAセットアップが動作しない

Exception in thread "main" 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.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:447) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy32.findAll(Unknown Source) 
    at test.Main.main(Main.java:13) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Lorg/hibernate/FlushMode; 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.prepareFlushMode(HibernateJpaDialect.java:187) 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:173) 
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380) 
    ... 19 more 

これは私の主な方法である:これは私のコンテキストの設定である

package test; 

import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import java.util.*; 

public class Main { 
    public static void main(String[] args) { 
     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Context.class); 

     NameRepository repo = context.getBean(NameRepository.class); 

     List<Name> names = repo.findAll(); 
    } 
} 

package test; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import javax.sql.DataSource; 
import javax.persistence.EntityManagerFactory; 

import java.util.Properties; 

@Configuration 
@EnableJpaRepositories("test") 
@EnableTransactionManagement 
@ComponentScan("test") 
public class Context { 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
     dataSource.setUrl("jdbc:sqlserver://xxxxxxx;instanceName=xxxxxx;databaseName=Test"); 
     dataSource.setUsername("xxxxxxx"); 
     dataSource.setPassword("xxxxxxx"); 

     return dataSource; 
    } 

    @Bean 
    public EntityManagerFactory entityManagerFactory() { 
     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 

     Properties jpaProperties = new Properties(); 
     jpaProperties.put("hibernate.dialect","org.hibernate.dialect.SQLServer2008Dialect"); 

     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setDataSource(dataSource()); 
     factory.setPackagesToScan("test"); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setJpaProperties(jpaProperties); 
     factory.setPersistenceUnitName("org.hibernate.jpa.HibernatePersistenceProvider"); 
     factory.afterPropertiesSet(); 

     return factory.getObject(); 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory()); 

     return transactionManager; 
    } 
} 

私のエンティティクラス:

package test; 

import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 

@Entity 
public class Name { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    private String name; 

    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    public Name() { 

    } 
} 

マイリポジトリインタフェース:

package test; 

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.stereotype.Repository; 

@Repository 
public interface NameRepository extends JpaRepository<Name, Long> { 
} 

そしてもちろん、私のMavenの依存関係:

<dependencies> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-context</artifactId> 
    <version>4.3.5.RELEASE</version> 
</dependency> 
<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-jpa</artifactId> 
    <version>1.10.6.RELEASE</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>5.2.6.Final</version> 
</dependency> 
<dependency> 
    <groupId>com.microsoft.sqlserver</groupId> 
    <artifactId>mssql-jdbc</artifactId> 
    <version>6.1.0.jre8</version> 
</dependency> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-tx</artifactId> 
    <version>4.3.5.RELEASE</version> 
</dependency> 
</dependencies> 

誰も私を助けてくださいことはできますか?

+0

このサイトで「NoSuchMethodError:org.hibernate.Session.getFlushMode()」を検索するとどうなりますか? –

+0

@NeilStockton私は、Spring 4.2.9を使用して、Hibernate-core 5.1および5.0を使用しようとしました。動作しませんでした。 – st4rbuck

答えて

0

私はあなたのポンポンで休止状態-EntityManagerの依存性が必要だと思う:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>5.2.5.Final</version> 
</dependency> 
+0

残念ながら、それはうまくいきませんでした。また、私が知っている限り、hibernate-entitymanagerは廃止予定です。コードはhibernate-coreに移動しました。 – st4rbuck

+0

mavenでbulidして/ targetに行き、libフォルダに複数のhibernate-core jarが入っていますか?バージョンは何ですか? –

+0

残念ながら、libフォルダはありません。 – st4rbuck

0

私は完全には覚えていないが、私は春データJPAで働いていたとき、私は私のシステムで豆へのアクセス問題が発生した覚えています主な方法。私が覚えていると思うことは、NameRepositoryをパラメータとするMainクラスのメソッドで@Autowiredを使用することでした。申し訳ありません、私はあまり覚えていません。

@AutoWired 
public void findAllAtInit(NameRepository repo){ 
List<Name> names = repo.findAll(); 
} 
0

これをpom.xmlに追加しました。今はうまくいく。

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-orm</artifactId> 
    <version>4.3.5.RELEASE</version> 
</dependency> 
関連する問題