Статьи

Работа с MongoDB с использованием Kundera

Kundera — библиотека ORM на основе JPA 2.0 (Java Persistence API), изначально разработанная для базы данных Cassandra. Поддержка Hbase была позже добавлена ​​к нему.

Те, кто новичок в Кундере, должны прочитать это,  чтобы получить основную идею. Для нетерпеливых — начни с Кундеры за 5 минут !

Кундера теперь поддерживает MongoDB — документно-ориентированную базу данных. Некоторые существенные особенности модели данных MongoDB:

  1. Документы хранятся как «коллекции» в БД.
  2. Документ может быть встроен в другой документ, и, следовательно, для извлечения данных соединение не требуется. Это делает работу с базой данных быстрой.
  3. Драйверы доступны для большинства популярных языков программирования.

Наша модель данных

В этом руководстве мы будем использовать ниже сущности EMAIL и ATTCHMENT в качестве нашей модели данных и выполнять операции CRUD с использованием Kundera.
Модель данных

Наши объекты в формате JSON:

{
EMAIL:
	{
	“MESSAGE_ID” : “1″,
	“SUBJECT” : “Please Join Meeting”,
	“BODY” : “Agenda: RFP discussion”,
	“FROM” :
		{
		“CONTACT_ID” : “a″,
		“FIRST_NAME” : “Amresh”,
		“LAST_NAME” : “Singh”,
		“EMAIL_ID” : “[email protected]”
		}
	“TO” :  [
                {
		“CONTACT_ID” : “b″,
		“FIRST_NAME” : “Vivek”,
		“LAST_NAME” : “Mishra”,
		“EMAIL_ID” : “[email protected]”
		},
                {
		“CONTACT_ID” : “c″,
		“FIRST_NAME” : “Saurabh”,
		“LAST_NAME” : “Singh”,
		“EMAIL_ID” : “[email protected]”
		}
                ]
	}
}
{
ATTACHMENT:
           {
           "ATTCHMENT_ID" : "aaa",
           "FILE_NAME" : "Agenda.doc",
           "FILE_TYPE" : "MS Word",
           "MESSAGE_ID" : "1"
           }
           {
           "ATTCHMENT_ID" : "bbb",
           "FILE_NAME" : "MOM_Last_Meeting.xls",
           "FILE_TYPE" : "MS Excel",
           "MESSAGE_ID" : "1"
           }
           {
           "ATTCHMENT_ID" : "ccc",
           "FILE_NAME" : "Client_Feedback.txt",
           "FILE_TYPE" : "Text",
           "MESSAGE_ID" : "1"
           }
}

Настройка среды


Во-первых, вам нужно установить MongoDB на вашем компьютере.
Перейдите по
этой ссылке, чтобы установить и запустить сервер MongoDB на вашем компьютере.

После этого загрузите банки Kundera или включите их в свой проект Maven.
Подробные шаги описаны
здесь .

Создать классы сущностей

  • Ваши классы сущностей должны быть аннотированы @Entity, а каждое поле должно быть аннотировано @Column.
  • Поле, соответствующее первичному ключу, должно быть отмечено @Id.
  • В дополнение к этому, ваш класс сущностей также должен быть аннотирован @Table, который используется Kundera для определения имени БД и имени коллекции.
  • Все поля встроенных сущностей должны быть аннотированы @Embedded или @ElementCollection. Они хранятся с таблицей вложенных объектов
  • Все отношения должны быть аннотированы с помощью @OneToOne, @OneToMany, @ManyToOne или @ManyToMany. Они хранятся в виде отдельной коллекции, и связь поддерживается либо через столбец соединения, либо через таблицу соединений, в зависимости от обстоятельств.

Email Entity


import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table(name = "EMAIL", schema = "KunderaExamples@twingo") public class Email { @Id @Column(name="MESSAGE_ID") private String messageId; @Column(name = "SUBJECT") private String subject; @Column(name = "BODY") private String body; @Embedded private Contact from; @ElementCollection @CollectionTable(name = "TO") private List<Contact> to; @OneToMany (cascade={CascadeType.ALL}, fetch=FetchType.LAZY) @JoinColumn(name="MESSAGE_ID") private List<Attachment> attachments; //Getters, setters, constructors and utility methods omitted. }

Связаться с вложенным объектом

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class Contact
{

 @Column(name = "CONTACT_ID")
 String contactId;

 @Column(name = "LAST_NAME")
 String lastName;

 @Column(name = "FIRST_NAME")
 String firstName;

 @Column(name = "EMAIL_ID")
 String emailId;

 //Getters, setters, constructors and utility methods omitted.
}

Вложение Entity

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "ATTACHMENT", schema = "KunderaExamples@twingo")
public class Attachment
{

 @Id
 @Column(name="ATTCHMENT_ID")
 private String attachmentId;

 @Column(name = "FILE_NAME")
 private String fileName;

 @Column(name = "FILE_TYPE")
 private String fileType;
 //Getters, setters, constructors and utility methods omitted.

}

Создать файл persistence.xml

Добавьте приведенную ниже запись в свой файл persistence.xml, чтобы позволить kundera узнать имя и подробности модуля постоянства. Это имя используется в коде приложения для установления соединения с MongoDB и постоянными сущностями.

<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_1_0.xsd" version="2.0">
<persistence-unit name="twingo">
    <provider>com.impetus.kundera.KunderaPersistence</provider>
    <properties>
        <property name="kundera.nodes" value="localhost" />
        <property name="kundera.port" value="27017" />
        <property name="kundera.keyspace" value="KunderaExamples" />
        <property name="kundera.dialect" value="mongodb" />
        <property name="kundera.client.lookup.class" value="com.impetus.client.mongodb.MongoDBClientFactory" />
        <property name="kundera.cache.provider.class" value="com.impetus.kundera.cache.ehcache.EhCacheProvider" />
        <property name="kundera.cache.config.resource" value="/ehcache-test.xml" />
    </properties>
 </persistence-unit>
</persistence>

Выполнение операций CRUD


Теперь мы готовы написать нашу простую Java-программу для сохранения, доступа и удаления сущности «Электронная почта».

Для каждой из этих операций необходимо выполнить следующие шаги:
  1. Создайте экземпляр EntityManagerFactory, указав в качестве параметра имя модуля сохраняемости.
  2. Выполните работу с базой данных, используя API JPA 2.0.
  3. Очистка ресурсов.

Вставьте новый объект:


Ниже приведен код для записи сущности Email в базу данных, которая хранится в виде документа в MongoDB.
Email email = new Email();

email.setMessageId("1");
email.setSubject("Please Join Meeting");
email.setBody("Agenda: RFP discussion");
email.setFrom(new Contact("a", "Amresh", "Singh", "[email protected]"));

email.addTo(new Contact("b", "Vivek", "Mishra", "[email protected]"));
email.addTo(new Contact("c", "Saurabh", "Singh", "[email protected]"));

email.addAttachment(new Attachment("aaa", "Agenda.doc", "MS Word"));
email.addAttachment(new Attachment("bbb", "MOM_Last_Meeting.xls", "MS Excel"));
email.addAttachment(new Attachment("ccc", "Client_Feedback.txt", "Text"));

EntityManagerFactory emf = Persistence.createEntityManagerFactory("twingo");
EntityManager em = emf.createEntityManager();
em.persist(email);
em.close();

emf.close();

Вы можете проверить, была ли сущность успешно сохранена из оболочки mongodb:

amresh@ubuntu:/usr/local/mongodb$ ./bin/mongo
MongoDB shell version: 1.8.1
connecting to: test
> use KunderaExamples;
switched to db KunderaExamples
> show collections;
ATTACHMENT
EMAIL
system.indexes
> db.EMAIL.find();
{ "_id" : "1", "MESSAGE_ID" : "1", "subject" : { "SUBJECT" : "Please Join Meeting" }, "body" : { "BODY" : "Agenda: RFP discussion" }, "to" : [
 {
 "CONTACT_ID" : "b",
 "LAST_NAME" : "Mishra",
 "FIRST_NAME" : "Vivek",
 "EMAIL_ID" : "[email protected]"
 },
 {
 "CONTACT_ID" : "c",
 "LAST_NAME" : "Singh",
 "FIRST_NAME" : "Saurabh",
 "EMAIL_ID" : "[email protected]"
 }
], "from" : { "CONTACT_ID" : "a", "LAST_NAME" : "Singh", "FIRST_NAME" : "Amresh", "EMAIL_ID" : "[email protected]" } }

> db.ATTACHMENT.find();
{ "_id" : "aaa", "ATTCHMENT_ID" : "aaa", "FILE_NAME" : "Agenda.doc", "FILE_TYPE" : "MS Word", "MESSAGE_ID" : "1" }
{ "_id" : "bbb", "ATTCHMENT_ID" : "bbb", "FILE_NAME" : "MOM_Last_Meeting.xls", "FILE_TYPE" : "MS Excel", "MESSAGE_ID" : "1" }
{ "_id" : "ccc", "ATTCHMENT_ID" : "ccc", "FILE_NAME" : "Client_Feedback.txt", "FILE_TYPE" : "Text", "MESSAGE_ID" : "1" }
>

Обновите существующую сущность:

Код для обновления сущности аналогичен тому, который используется для вставки сущности. Вам просто нужно установить поля в объекте и сохранить его. Он будет обновлен в MongoDB.

Найти сущность:

Поиск объекта означает получение одного объекта, если вы знаете первичный ключ. Вот код Java для выполнения этой задачи:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("twingo");
EntityManager em = emf.createEntityManager();
Email email = em.find(Email.class, "1");
em.close();
emf.close();

Запустите запрос JPA:

Кундера поддерживает JPA-QL. Ниже приведен пример кода, который выбирает все электронные письма из коллекции.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("twingo");
//Get all emails
EntityManager em = emf.createEntityManager();
Query q = em.createQuery("select e from Email e");
List<?> emails = q.getResultList();
em.close();
emf.close();

Удалить объект:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("twingo");
EntityManager em = emf.createEntityManager();
Email email = em.find(Email.class, "1");
em.remove(email);
em.close();
emf.close();

Вывод

Kundera облегчает работу с базами данных NoSQL, такими как Cassandra, Hbase, MongoDB, благодаря поддержке JPA. В результате программистам нужно писать меньше строк кода, которые легко понять и поддерживать. Другое преимущество заключается в том, что вам не нужно переписывать свой код, если вы решите сменить поставщика базы данных (скажем, с MongoDB на Cassandra). Единственное, что вам потребуется, — это добавить запись модуля постоянства в файл persistence.xml и использовать это имя в коде приложения.