Spring Данные JPA и MyBatis

Я пытаюсь использовать 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

Спасибо


person srini    schedule 11.11.2015    source источник
comment
MyBatis не является реализацией JPA. Не понимаю, как вы могли бы использовать с ним Spring-Data-JPA.   -  person JB Nizet    schedule 11.11.2015
comment
@JBNizet Интересно, что вы упомянули об этом. Я предположил, что MyBatis — это ORM, реализующий JPA, как это делает Hibernate. Думаю, этот вопрос недействителен в этом случае. Спасибо.   -  person srini    schedule 11.11.2015
comment
Вы можете показать полный XML-файл spring и полную трассировку стека. Будет полезно определить   -  person Karthikeyan    schedule 25.05.2017
comment
Вы можете использовать их оба вместе (что я и делал), но, согласно вашей информации выше, этого недостаточно, чтобы определить, чего вы пытаетесь достичь.   -  person Ian Lim    schedule 06.01.2018


Ответы (5)


Mybatis не реализует JPA. Mybatis не является ORM Framework. JPA — это спецификация ORM, реализованная Hibernate, Toplink, Eclipselink. Поскольку Mybatis не реализует JPA, он не входит в список поставщиков JPA. Следовательно, вы не можете использовать mybatis в качестве фреймворка JPA. Mybatis — это фреймворк отображения данных, который совершенно отличается от JPA. В рамках JPA и ORM вы сопоставляете объекты/сущности с соответствующими таблицами sql и работаете с объектами, а не с таблицами напрямую, если только вы не используете их собственные запросы. В mybatis вы играете напрямую с данными sql. Надеюсь, это проясняет разницу между mybatis и JPA. Следовательно, когда вы хотите использовать mybatis с данными весны, вы используете mybatis данных весны независимо, а не данные JPA весны.

person Pankaj Shet    schedule 14.07.2020

Почему бы не попробовать spring-data-jpa-extra

Он предоставляет решение для динамических запросов для spring-data-jpa, такое как mybatis, но намного проще, чем mybatis.

Я думаю, вам бы понравилось :)

person stormning    schedule 07.05.2016

Весенние данные MyBatis

Если вы не хотите использовать реализацию JPA, такую ​​как Spring-Data- JPA, но вам нравится использовать Spring-Data вы можете найти Spring-Data-Mybatis полезный проект.

Я знаю, что это не точный ответ на ваш вопрос, но я надеюсь, что этот ответ может быть интересным.

person Leonardo Saracini    schedule 11.05.2016
comment
Этот проект не актуален и не имеет рабочей демоверсии. Автор не предоставляет никакой информации. - person Dimitri Kopriwa; 09.11.2016
comment
Последние коммиты были сделаны 6 октября 2016 года, поэтому они работают над проектом. На вкладке «Вопросы» я вижу, что какая-то тема закрыта 6 минут назад. Если проект не работает сейчас, будет проблема с обновлением версии Spring-Data. Попробуйте открыть тему. - person Leonardo Saracini; 09.11.2016
comment
Я тот, кто открывает вопросы. Плагин не обновлен и не может работать с последней весенней версией, я на нем уже больше недели, и автор толком не отвечает на мои вопросы. Если вы являетесь пользователем плагина, возможно, вы не смогли ответить на текущий вопрос :) - person Dimitri Kopriwa; 09.11.2016

Версия Spring-Data-Mybatis для Hatunet

Я использую этот проект: https://github.com/hatunet/spring-data-mybatis< /а>

Он очень хорошо сочетается с spring-data-mybatis, а также имеет репозиторий с разбивкой на страницы.

Очень хорошо работать над производственным проектом.

обновление от августа 2020 г.

Проект переместился в другое веб-пространство и развивался: https://github.com/easybest/spring-data-mybatis

person Dimitri Kopriwa    schedule 23.10.2017
comment
Я обновил ссылку на репозиторий, так как новая версия теперь относится к пространству имен easyJet. Проект стабилен. - person Dimitri Kopriwa; 11.08.2020

Вот конфигурация mybatis и jpa в Spring Framework. 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()
}

person Atif    schedule 14.07.2020