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