Hibernate OGM с MongoDB - ClassNotFoundException при создании EntityManagerFactory

Я пытаюсь использовать Hibernate OGM с MongoDB, но у меня есть проблема с ClassNotFoundException и NoClassDefFoundError при доступе к базе данных, и я понятия не имею, почему.

Вот мой код

package com.example.model;

import org.hibernate.annotations.Type;
import org.springframework.stereotype.Indexed;

import javax.persistence.*;

@Indexed
@Entity
@Table(name = "customer")
public class Customer {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Type(type = "objectid")
private String id;

private String firstName;
private String lastName;

public Customer() {};

public Customer(String firstName, String lastName) {
    this.setFirstName(firstName);
    this.setLastName(lastName);
}

@Override
public String toString() {
    return String.format(
            "Customer[id=%s, firstName='%s', lastName='%s']",
            getId(), getFirstName(), getLastName());
}

public String getId(){
    return this.id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}
}

И здесь я получаю доступ к базе данных

package com.example.repository;

import com.example.model.Customer;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import java.util.List;
import java.util.Optional;

@Repository("customerRepository")
public class CustomerNoSQLRepository {

public List<Customer> findAll(){
    EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "ogm-jpa-tutorial" );
    EntityManager entitymanager = emfactory.createEntityManager();

    Query query = entitymanager.createQuery("SELECT * from customer");
    List<Customer> list = query.getResultList();

    for(Customer e:list) {
        System.out.println("Customer NAME :"+e.getFirstName()+" "+e.getLastName());
    }

    return list;
}
}

Вот зависимость в persistence.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.3.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.ogm</groupId>
        <artifactId>hibernate-ogm-mongodb</artifactId>
        <version>5.1.0.Final</version>
    </dependency>

    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>1.1</version>
    </dependency>
</dependencies>

Это постоянство.xml

<?xml version="1.0"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0">

<persistence-unit name="ogm-jpa-tutorial" transaction-type="RESOURCE_LOCAL">
    <!-- Use Hibernate OGM provider: configuration will be transparent -->
        <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>

    <class>test.y.model.Post</class>

    <properties>
        <property name="hibernate.ogm.datastore.provider" value="mongodb" />
        <!--<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" />-->
        <property name="hibernate.ogm.datastore.host" value="127.0.0.1"/>
        <property name="hibernate.ogm.datastore.port" value="27017"/>
        <property name="hibernate.ogm.datastore.create_database" value="true"/>
        <property name="hibernate.ogm.datastore.database" value="mongotestdb"/>
        <!--<property name="hibernate.ogm.datastore.username" value="admin"/>-->
        <!--<property name="hibernate.ogm.datastore.password" value="password"/>-->
    </properties>
</persistence-unit>
</persistence>

Журнал ошибок находится в ссылке здесь. https://pastebin.com/i1zvqQqq

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

1 ответ

Решение

Проблема здесь вызвана несоответствием между версией Hibernate ORM, которая будет требоваться используемой вами OGM Hibernate и той, которую вы указали в pom.xml.

Если вы хотите использовать Hibernate OGM 5.1.x, вам нужно использовать Hibernate ORM 5.1.x, см. Таблицу совместимости здесь: http://hibernate.org/ogm/releases/5.1.

<dependency>
<groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.1.15.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.1.15.Final</version>
    </dependency>

Или, что еще лучше, вы можете использовать более новую версию Hibernate OGM.

Другие вопросы по тегам