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” : “[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-программу для сохранения, доступа и удаления сущности «Электронная почта».
Для каждой из этих операций необходимо выполнить следующие шаги:
- Создайте экземпляр 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", "[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 и использовать это имя в коде приложения.