Конфигурация гибернации с MongoDB

Я пытался возиться с MongoDB и Hibernate в Java. У меня возникли некоторые проблемы с файлом конфигурации для него.

Я уже использовал Hibernate в прошлом с SQL DB, но кажется, что файл конфигурации должен быть совершенно другим для MongoDB.

Согласно этой документации, следует выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<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/persistencenew Configuration().configure().buildSessionFactory();0.xsd"
             version="2.0">

    <persistence-unit name="eshop" transaction-type="JTA">
        <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
        <class>org.hsnr.rest.domain.entities.Address</class>
        <class>org.hsnr.rest.domain.entities.Order</class>
        <class>org.hsnr.rest.domain.entities.Person</class>
        <class>org.hsnr.rest.domain.entities.Product</class>
        <class>org.hsnr.rest.domain.entities.User</class>
        <properties>
            <property name="hibernate.transaction.jta.platform"
                            value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" />
            <property name="hibernate.ogm.datastore.provider"
                            value="mongodb" />
        </properties>
    </persistence-unit>
</persistence>

Однако, когда я пытаюсь создать сеанс с

new Configuration().configure().buildSessionFactory();

Я получаю следующую ошибку:

org.hibernate.internal.util.config.ConfigurationException: Unable to perform unmarshalling at line number 5 and column 28 in RESOURCE hibernate.cfg.xml. Message: cvc-elt.1: Cannot find the declaration of element 'persistence'.

Является ли мой подход неправильным или я что-то упустил из виду?


person Honza Štefánik    schedule 12.07.2017    source источник
comment
AFAIR mongo — это база данных NoSQL. Вы уверены, что Hibernate его поддерживает?   -  person talex    schedule 12.07.2017
comment
@talex Я думаю, что это должно быть hibernate.org/ogm   -  person Honza Štefánik    schedule 12.07.2017
comment
@Seelenvirtuose Как правильно его настроить? Я уже пытался добавить стандартный файл cfg.xml для Hibernate, но для этого требуется указать диалект, а для этого нет опции NoSQL/MongoDB.   -  person Honza Štefánik    schedule 12.07.2017


Ответы (3)


Вы можете попробовать базовую тестовую настройку, как показано ниже, для вашей конфигурации.

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory( "eshop" );
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
// perform operations here
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
person s7vr    schedule 12.07.2017
comment
Он говорит javax.persistence.PersistenceException: No Persistence provider for EntityManager named eshop, когда я пытаюсь создать EntityManagerFactory для себя, есть идеи, что может быть причиной? - person Honza Štefánik; 14.07.2017
comment
Понятия не имею, но мой persistence.xml находится под src/main/resources/META_INF. Быстрый поиск приводит меня к этому сообщению stackoverflow.com/questions/19322827/ - person s7vr; 14.07.2017
comment
Да, я уже видел эти вопросы, мой persistence.xml расположен правильно. - person Honza Štefánik; 15.07.2017

Из javadoc configure():

Используйте сопоставления и свойства, указанные в ресурсе приложения с именем hibernate.cfg.xml.

Вместо этого вы устанавливаете persistence.xml. Использование using javax.persistence.Persistence должно работать:

EntityManagerFactory emf = Persistence.createEntityManagerFactory( "eshop" );

Если по какой-то причине вам вместо этого нужна фабрика сеансов, но вы работаете с JPA, вы можете получить ее с помощью метода unwrap()

SessionFactory sf = emf.unwrap( SessionFactory.class );    

ОБНОВЛЕНИЕ: Вы также можете создать фабрику программно, есть класс OgmConfiguration (который расширяет Configuraiton):

    OgmConfiguration configuration = new OgmConfiguration();

    // This is optional, if you want to set some options using
    // a fluent API
    configuration.configureOptionsFor( MongoDB.class )
        .writeConcern( WriteConcernType.UNACKNOWLEDGED );

    SessionFactory sf = configuration
        .addAnnotatedClass( org.hsnr.rest.domain.entities.Address.class )
        // ... Other annotated classes
        .setProperty( OgmProperties.DATABASE, "mongodb_database" )
        .setProperty( OgmProperties.DATASTORE_PROVIDER, DatastoreProviderType.MONGODB.name() )

        // All this properties are optional, appropriate default will be used if missing
        .setProperty( OgmProperties.CREATE_DATABASE, "false" )
        .setProperty( OgmProperties.USERNAME, "username" )
        .setProperty( OgmProperties.PASSWORD, "password" )
        .setProperty( OgmProperties.HOST, "localhost:12897" )

        // Check MongoDBProperties for MongoDB specific options
        .setProperty( MongoDBProperties.AUTHENTICATION_MECHANISM, AuthenticationMechanismType.BEST.name() )

        .buildSessionFactory();

В этом примере я добавил несколько параметров, чтобы дать обзор, но если вы используете значения по умолчанию и вам не нужна аутентификация, нужны только имя базы данных и поставщик хранилища данных.

person Davide    schedule 13.07.2017
comment
Есть ли только конфигурация xml, я имею в виду, что я не нашел конфигурацию java для MongoDB. - person Menai Ala Eddine - Aladdin; 10.05.2018
comment
Я обновил свой ответ, если вы хотите знать, как его настроить программно. - person Davide; 10.05.2018
comment
Хорошо, это обновление сделает ваш ответ более богатым. - person Menai Ala Eddine - Aladdin; 11.05.2018

используйте следующий код:

<hibernate-configuration
    xmlns="http://www.hibernate.org/xsd/hibernate-configuration"
    xsi:schemaLocation="http://www.hibernate.org/xsd/hibernate-configuration hibernate-configuration-4.0.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
person Anshul Sharma    schedule 12.07.2017
comment
Я попытался использовать обычный файл hibernate.cfg.xml, который начинался с этого, но для него требуется набор диалектов, из-за этого я получаю исключение. В документации, на которую я ссылаюсь, также говорится, что диалект не установлен с базами данных NoSQL (более интересным является список параметров, которые не применяются к Hibernate OGM и которые не следует устанавливать: hibernate.dialect). Есть ли способ использовать обычный файл конфигурации с файлом persistence.xml вместе, который я пропустил? - person Honza Štefánik; 12.07.2017
comment
Я обновил свой ответ другим примером, если это не поможет, не могли бы вы опубликовать где-нибудь небольшой тестовый проект, чтобы показать, что вы пытаетесь сделать? спасибо - person Davide; 11.05.2018