【问题标题】:Spring Data JPA & MyBatisSpring Data JPA 和 MyBatis
【发布时间】:2016-02-12 16:26:21
【问题描述】:

我正在尝试将 Spring Data JPA 与 MyBatis 一起使用。由于没有 MyBatis 的供应商适配器,这里有什么替代方案?

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.abc.xyz.domain"/>
</bean>

当我尝试初始化我的应用程序时遇到以下异常。

Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No PersistenceProvider specified in EntityManagerFactory configuration, and chosen PersistenceUnitInfo does not specify a provider class name either

谢谢

【问题讨论】:

  • MyBatis 不是 JPA 实现。不明白如何使用 Spring-Data-JPA。
  • @JBNizet 你提到它很有趣。我碰巧假设 MyBatis 是一个像 Hibernate 一样实现 JPA 的 ORM。猜猜这个问题在这种情况下是无效的。谢谢。
  • 您可以显示完整的spring xml文件和完整的堆栈跟踪。这将是有用的识别
  • 您可以同时使用它们(我一直在这样做)但根据您上面的信息,这不足以确定您要达到的目标。

标签: java spring-data-jpa mybatis spring-mybatis


【解决方案1】:

Mybatis 没有实现 JPA。 Mybatis 不是 ORM 框架。 JPA 是由 Hibernate、Toplink、Eclipselink 实现的 ORM 规范。由于 Mybatis 没有实现 JPA,所以它不属于 JPA 提供者的列表。 因此,您不能将 mybatis 用作 JPA 框架。 Mybatis 是一个数据映射器框架,与 JPA 相比是完全不同的框架。 在 JPA 和 ORM 框架中,您将 Objects /Entities 映射到相应的 sql 表,并且您处理对象而不是直接处理表,除非您使用它们的本机查询。 在 mybatis 中,你直接玩 sql 数据.. 希望这可以清除 mybatis 和 JPA 之间的区别。 因此,当您希望 mybatis 带有 spring 数据时,您可以独立使用 spring data mybatis 而不是 spring data JPA。

【讨论】:

    【解决方案2】:

    为什么不试试spring-data-jpa-extra

    它提供了类似mybatis的spring-data-jpa的动态查询解决方案,但比mybatis容易很多。

    我想你会喜欢的:)

    【讨论】:

      【解决方案3】:

      Spring Data MyBatis

      如果您喜欢使用像 Spring-Data-JPA 模块这样的 JPA 实现,但您喜欢使用 Spring-Data,那么您会发现 Spring-Data-Mybatis 是一个有用的项目。

      我知道这不是对您问题的准确答案,但我希望这个答案会很有趣。

      【讨论】:

      • 这个项目不是最新的,也没有工作演示。作者没有提供任何信息。
      • 最后一次提交是在 2016 年 10 月 6 日,因此他们正在处理该项目。在“问题”选项卡上,我看到 6 分钟前关闭了一些主题。如果项目现在不工作将是更新 Spring-Data 版本的麻烦。尝试打开一个问题。
      • 我是打开问题的人。该插件不是最新的,不能与最新的春季版本一起使用,我已经使用了一个多星期了,作者并没有真正回答我的问题。如果您是该插件的用户,您可能无法回答当前问题 :)
      【解决方案4】:

      Spring-Data-Mybatis Hatunet 版本

      我正在使用这个项目:https://github.com/hatunet/spring-data-mybatis

      它非常适合 spring-data-mybatis 并且它也有分页存储库。

      在生产项目上工作得很好。

      2020 年 8 月更新

      项目转移到另一个网络空间并发展:https://github.com/easybest/spring-data-mybatis

      【讨论】:

      • 我更新了存储库链接,因为新版本现在是 om easyJet 命名空间。项目稳定。
      【解决方案5】:

      这里是spring框架中mybatis和jpa的配置。 Mybatis 和 jpa 是不同的框架,所以不能将 mybatis 用作 JPA 框架。如果您无法赶上配置,请随时提出任何问题。

      package com.mastering.springbatch.config;
      
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.mybatis.spring.SqlSessionFactoryBean;
      import org.springframework.boot.autoconfigure.domain.EntityScan;
      import org.springframework.boot.context.properties.ConfigurationProperties;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.context.annotation.Primary;
      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.JpaVendorAdapter;
      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;
      
      @Configuration
      @EnableTransactionManagement
      @EnableJpaRepositories(
              basePackages = {"com.mastering.springbatch.dao",
                      "com.mastering.springbatch.repository"})
      @EntityScan("com.mastering.springbatch.entity")
      public class DataConfig {
          private final String ENTITY_PACKAGE = "com.mastering.springbatch.entity";
          private DriverManagerDataSource dataSource;
      
          @Primary
          @Bean(value = "customDataSource")
          @ConfigurationProperties(prefix = "spring.datasource")
          public DataSource dataSource() {
              DriverManagerDataSource dataSource = new DriverManagerDataSource();
              this.dataSource = dataSource;
              return dataSource;
          }
      
          @Primary
          @Bean(value = "entityManagerFactory")
          public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
              LocalContainerEntityManagerFactoryBean emf =
                      new LocalContainerEntityManagerFactoryBean();
              emf.setPackagesToScan(ENTITY_PACKAGE);
              emf.setDataSource(dataSource());
              emf.setJpaVendorAdapter(jpaVendorAdapter());
              return emf;
          }
      
          @Primary
          @Bean(value = "sqlSessionFactory")
          public SqlSessionFactory sqlSessionFactory() throws Exception {
              SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
              factoryBean.setDataSource(dataSource());
              return factoryBean.getObject();
          }
      
      
          @Primary
          @Bean(name = "transactionManager")
          public PlatformTransactionManager transactionManager() {
              JpaTransactionManager tm = new JpaTransactionManager();
              tm.setEntityManagerFactory(entityManagerFactory().getObject());
              return tm;
          }
      
          private JpaVendorAdapter jpaVendorAdapter() {
              HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
              jpaVendorAdapter.setShowSql(true);
              jpaVendorAdapter.setGenerateDdl(true);
              jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");
              return jpaVendorAdapter;
          }
      }
      
      

      这是build.gradle 文件

      buildscript {
          ext {
              springBootVersion = '2.1.8.RELEASE'
              springBootDepManagementVersion = '1.0.8.RELEASE'
          }
          repositories {
              mavenLocal()
              mavenCentral()
          }
          dependencies {
              classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
              classpath "io.spring.gradle:dependency-management-plugin:${springBootDepManagementVersion}"
          }
      }
      
      apply plugin: 'org.springframework.boot'
      apply plugin: 'io.spring.dependency-management'
      apply plugin: 'java'
      apply plugin: 'idea'
      
      
      group 'com.learning'
      version '1.0-SNAPSHOT'
      
      sourceCompatibility = 1.8
      
      configurations {
          implementation.exclude module: "spring-boot-starter-tomcat"
      }
      
      repositories {
          mavenLocal()
          mavenCentral()
      }
      
      dependencies {
          compile 'org.mybatis:mybatis:3.5.0'
          compile 'org.mybatis:mybatis-spring:2.0.0'
      
          implementation("org.springframework.boot:spring-boot-starter-data-jpa")
          implementation("org.springframework.boot:spring-boot-starter-batch")
          implementation("org.springframework.boot:spring-boot-starter-web")
          
          implementation("mysql:mysql-connector-java:8.0.14")
          
      //    implementation("io.springfox:springfox-swagger2:2.7.0")
      //    implementation("io.springfox:springfox-swagger-ui:2.7.0")
          
          implementation("org.projectlombok:lombok:1.18.10")
          annotationProcessor("org.projectlombok:lombok:1.18.10")
          compile group: 'commons-io', name: 'commons-io', version: '2.6'
      
          testAnnotationProcessor("org.projectlombok:lombok:1.18.10")
          testCompile("junit:junit:4.12")
          testCompile("org.mockito:mockito-core:2.1.0")
          testCompile("org.springframework.boot:spring-boot-starter-test")
      
      }
      
      springBoot {
          buildInfo()
      }
      
      

      【讨论】:

        猜你喜欢
        • 2017-11-29
        • 1970-01-01
        • 2015-11-03
        • 2012-11-09
        • 2019-07-20
        • 2022-01-01
        • 2018-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多