Доступ к базам данных с 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









