Статьи

Играть в! NoSQL (Сборка приложений NoSQL с платформой Play)

Доступ к базам данных с Play! Фреймворк

Play Framework  — это высокоскоростной веб-фреймворк для Java и Scala. Это сделано для того, чтобы сделать разработку приложений быстрее и без проблем.

Играть в! предоставляет плагин для управления пулами соединений JDBC. Поэтому, если вы работаете с реляционными базами данных, все, что вам нужно сделать, это определить зависимости коннектора базы данных в его файле сборки, указать свойства соединения в файле конфигурации и вуаля! Вы готовы использовать источники данных с одной строкой кода. Вы можете настроить столько баз данных, сколько вам нужно. Это и многие другие игры! функции — это то, что большинство разработчиков пожелает.

… а NoSQL?

Тем не менее, интеграция Play! с базами данных NoSQL на этом все и заканчивается. Любой зрелый плагин NoSQL еще не разработан. Причина очевидна: эти базы данных разнообразны и в настоящее время не имеют общего API. Это означает, что плагин для всех этих баз данных должен быть написан отдельно.

Были такие попытки, как  PlayORM . Некоторые люди добились успеха с использованием Morphia , который, тем не менее, работает  только с  MongoDB . Я еще не пробовал их, но видел пользователей, борющихся с их использованием.

JPA к вашему спасению

Есть плохие новости. Пока играю! обеспечивает бесшовную  интеграцию JPA  с реляционными базами данных, поддержка NoSQL еще не поступила. Хорошая новость заключается в том, что  Kundera  — библиотека сопоставления объектных данных на основе JPA 2.0, может быть легко интегрирована с Play! Framework и позволяет работать как базы данных с базами данных, которые  он поддерживает в настоящее время . Эта статья с пошаговым руководством по настройке Play! создайте проект и интегрируйте его с Kundera для чтения и записи данных в Cassandra , одной из самых популярных баз данных NoSQL в городе. Тем не менее, вы можете свободно использовать базу данных по вашему выбору (конечно, из тех, которые поддерживаются Kundera). Читать дальше!

Настройка Play! проект

Скачать Play!

1. Перейдите на страницу  http://www.playframework.com/download  и загрузите последнюю версию Play! релиз (play-2.1.2.zip на момент написания этой статьи). Распакуйте в каталог по вашему выбору. Мы будем называть несжатый каталог папок PLAY_HOME.

2. Добавьте папку PLAY_HOME в переменную окружения PATH, чтобы она была удобной при запуске команд воспроизведения из вашего проекта. Если вы используете Bash, вы можете сделать это, просто добавив m в user.home / .bashrc

export PATH=$PATH:/home/impadmin/play-2.1.1

3.… и мы закончили. (подробные инструкции приведены  здесь ).

Создай свой проект

1. Перейдите в каталог, где вы хотите создать свой проект.

2. Создайте новый проект с именем play-jpa-kundera (или любое другое причудливое имя, которое вы хотели бы ему дать):

новый проект

3. Запустите команду «play», чтобы войти в Play! приставка.

4. Вы можете свободно использовать любой текстовый редактор по вашему выбору для написания исходного кода и изменения файлов конфигурации. Файлы настроек Eclipse могут быть сгенерированы с помощью команды «eclipse»:

играть в

5. выполнить команду «запустить» из Play! консоль (сервер запущен в режиме разработки)

бег

На этом этапе Jar зависимостей, указанный в Build.scala и других зависимостях Play, загружаются и копируются в classpath.

6. Протестируйте свое приложение, нажав localhost: 9000 в вашем любимом браузере.

браузер

7. Поздравляем! Ваша игра! Проект «play-jpa-kundera» готов к использованию. Импортируйте этот проект в Eclipse (если хотите) и начните играть с ним. (Подробные инструкции для вышеуказанных шагов доступны  здесь )

Играть в! с кундерами

Добавить зависимости Кундеры в проект / Build.scala

Вам нужно добавить Jar зависимости Kundera (которые, кстати, доступны в репозитории maven) в ваш проект. Измените файл Build.Scala в папке проекта. Это должно выглядеть так:

import sbt._
import Keys._
import play.Project._
 
object ApplicationBuild extends Build {
 val appName = "play-jpa-kundera"
 val appVersion = "1.0-SNAPSHOT"
 
 val appDependencies = Seq(
 "com.impetus.client" % "kundera-cassandra" % "2.5",
 javaCore
 )
 
val main = play.Project(appName, appVersion, appDependencies).settings(
 //Kundera Public repositories
 ebeanEnabled := false,
 resolvers += "Kundera" at "https://oss.sonatype.org/content/repositories/releases",
 resolvers += "Riptano" at "http://mvn.riptano.com/content/repositories/public",
 resolvers += "Kundera missing" at "http://kundera.googlecode.com/svn/maven2/maven-missing-resources",
 resolvers += "Scale 7" at "https://github.com/s7/mvnrepo/raw/master"
 )
}

Всегда лучше использовать самый  последний выпуск  Кундеры.

Внимание: приложение-зависимость javaJdbc  загружает файл jar hibernate-entitymanager, который мешает работе Kundera. Убедитесь, что вы удалили эту зависимость приложения, которая по умолчанию присутствует.

Напишите persistence.xml

Теперь мы готовы создать наш постоянный код. Первым шагом к этому является написание файла persistence.xml, который следует поместить в папку conf / META-INF:

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="cassandra_pu">
 <provider>com.impetus.kundera.KunderaPersistence</provider>
 <class>model.User</class>
 <properties>
 <property name="kundera.nodes" value="localhost"/>
 <property name="kundera.port" value="9160"/>
 <property name="kundera.keyspace" value="KunderaExamples"/>
 <property name="kundera.dialect" value="cassandra"/>
 <property name="kundera.client.lookup.class" value="com.impetus.client.cassandra.thrift.ThriftClientFactory" />
 <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>

Здесь model.User — это класс сущностей, который мы собираемся написать дальше.

Создать сущность пользователя

Создайте класс сущности User в пакете app / model:

package model;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name = "users", schema = "KunderaExamples@cassandra_pu")
public class User
{
 @Id
 private String userId;
 
 @Column(name="first_name")
 private String firstName;
 
 @Column(name="last_name")
 private String lastName;
 
 @Column(name="city")
 private String city;
 
//Getters/ setters/ constructors go here
 
}

Написать UserController

Теперь пришло время написать класс, где на самом деле происходит волшебство, UserController для операций persist / find / update / delete. Запишите этот класс в пакет app / controller:

package controllers;
 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
 
import model.User;
import play.Play;
import play.mvc.Controller;
import play.mvc.Result;
 
public class UserController extends Controller
{
 static EntityManagerFactory emf;
 
 public static Result persist()
 {
 EntityManager em = getEmf().createEntityManager();
 
User user = new User();
 user.setUserId("0001");
 user.setFirstName("John");
 user.setLastName("Smith");
 user.setCity("London");
 
em.persist(user);
 em.close();
 return ok("User 0001 record persisted for persistence unit cassandra_pu");
 }
 
public static Result find()
 {
 EntityManager em = getEmf().createEntityManager();
 User user = em.find(User.class, "0001");
 em.close();
 return ok("Found User in database with the following details:" + printUser(user));
 }
 
public static Result update()
 {
 EntityManager em = getEmf().createEntityManager();
 User user = em.find(User.class, "0001");
 user.setCity("New York");
 em.merge(user);
 user = em.find(User.class, "0001");
 return ok("Record updated:" + printUser(user));
 }
 
public static Result delete()
 {
 EntityManager em = getEmf().createEntityManager();
 User user = em.find(User.class, "0001");
 
em.remove(user);
 user = em.find(User.class, "0001");
 return ok("Record deleted:" + printUser(user));
 }
 
private static EntityManagerFactory getEmf()
 {
 if (emf == null)
 {
  emf = Persistence.createEntityManagerFactory("cassandra_pu");
 }
 return emf;
 }
 
private static String printUser(User user)
 {
 if (user == null)
 return "Record not found";
 
return "\n--------------------------------------------------" + "\nuserId:" + user.getUserId() + "\nfirstName:"
 + user.getFirstName() + "\nlastName:" + user.getLastName() + "\ncity:" + user.getCity();
 }
}

Добавить методы контроллера в файл conf / routs

Мы добавим один URL-путь для каждого из методов CRUD в контроллере. Добавьте их в файл conf / routs, он должен выглядеть следующим образом:

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
 
# Map static resources from the /public folder to the /assets URL path
 
GET /assets/*file controllers.Assets.at(path="/public", file)
 
################# User Controller###############
 
# Persist Operation
GET /persist controllers.UserController.persist()
 
# Find Operation
GET /find controllers.UserController.find()
 
# Update Operation
GET /update controllers.UserController.update()
 
# Delete Operation
GET /delete controllers.UserController.delete()

Сделать классы сущностей доступными во время выполнения

Вы можете пропустить этот шаг, если вы используете Play! в производственном режиме (запустив «начало игры»). Однако, если вы используете Play! в режиме разработки, Play! использует собственный загрузчик классов, который не читает классы из папки target / scala-2.xx / classes. В результате ваша сущность User не будет загружена во время выполнения, и Kundera будет выдавать ниже исключение при попытке запустить приложение:

com.impetus.kundera.KunderaException: com.impetus.kundera.KunderaException: EntityMetadata should not be null
at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:174)

Чтобы сделать ваши классы сущностей доступными во время выполнения (конечно, в режиме разработки), все, что вам нужно сделать, это создать из них файл jar и поместить этот файл jar в папку lib в корневом каталоге проекта.
(создайте папку lib, так как она не будет существовать по умолчанию)
юридические лица

Запустите Cassandra Server и создайте схему / таблицы

Я предполагаю, что вы уже настроили и работаете на своем компьютере с сервером Cassandra (или сервером базы данных, над которым вы работаете). Если нет, обратитесь к соответствующей документации.

Теперь создайте схему и таблицы для сущности User, которые будут записаны в:

impadmin@impetus-D189a:/usr/local/apache-cassandra-1.1.6/bin$ ./cassandra-cli --host localhost --port 9160
Connected to: "Test Cluster" on localhost/9160
Welcome to the Cassandra CLI.
Type 'help;' or '?' for help.
Type 'quit;' or 'exit;' to quit.
[default@unknown]create keyspace KunderaExamples;
[default@unknown]use KunderaExamples;
[default@KunderaExamples]create column family users with comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type;
81852270-2374-11e1-0000-242d50cf1fdd
Waiting for schema agreement...
... schemas agree across the cluster

Протестируйте свое приложение

Теперь время пристегнуть ремни безопасности! Запускайте ниже URL в вашем браузере один за другим:

1.  http: // localhost: 9000 / persist

упорствовать

Вы можете проверить вставленные данные из Cassandra-cli

кли

2.  http: // localhost: 9000 / find

находить

3.  http: // localhost: 9000 / update

Обновить

4.  http: // localhost: 9000 / delete

Удалить