Kundera — библиотека ORM на основе JPA 2.0 (Java Persistence API), изначально разработанная для базы данных Cassandra. Поддержка Hbase была позже добавлена к нему.
Те, кто новичок в Кундере, должны прочитать это, чтобы получить основную идею. Для нетерпеливых — начни с Кундеры за 5 минут !
Кундера теперь поддерживает MongoDB — документно-ориентированную базу данных. Некоторые существенные особенности модели данных MongoDB:
- Документы хранятся как «коллекции» в БД.
- Документ может быть встроен в другой документ, и, следовательно, для извлечения данных соединение не требуется. Это делает работу с базой данных быстрой.
- Драйверы доступны для большинства популярных языков программирования.
Наша модель данных
Наши объекты в формате 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” : “xamry@gmail.com”
}
“TO” : [
{
“CONTACT_ID” : “b″,
“FIRST_NAME” : “Vivek”,
“LAST_NAME” : “Mishra”,
“EMAIL_ID” : “mevivs@gmail.com”
},
{
“CONTACT_ID” : “c″,
“FIRST_NAME” : “Saurabh”,
“LAST_NAME” : “Singh”,
“EMAIL_ID” : “saurabh@gmail.com”
}
]
}
}
{
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-программу для сохранения, доступа и удаления сущности «Электронная почта».
Для каждой из этих операций необходимо выполнить следующие шаги:
- Создайте экземпляр EntityManagerFactory, указав в качестве параметра имя модуля сохраняемости.
- Выполните работу с базой данных, используя API JPA 2.0.
- Очистка ресурсов.
Вставьте новый объект:
Ниже приведен код для записи сущности 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", "xamry@gmail.com"));
email.addTo(new Contact("b", "Vivek", "Mishra", "mevivs@gmail.com"));
email.addTo(new Contact("c", "Saurabh", "Singh", "saurabh@gmail.com"));
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" : "mevivs@gmail.com"
},
{
"CONTACT_ID" : "c",
"LAST_NAME" : "Singh",
"FIRST_NAME" : "Saurabh",
"EMAIL_ID" : "saurabh@gmail.com"
}
], "from" : { "CONTACT_ID" : "a", "LAST_NAME" : "Singh", "FIRST_NAME" : "Amresh", "EMAIL_ID" : "xamry@gmail.com" } }
> 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 и использовать это имя в коде приложения.
