(三)play之yabe项目【数据模型】
创建项目
play new yabe
What is the application name? [yabe] Blog Engine
play eclipsify yabe
play run yabe
Eclipse引入项目
file -> import -> General ->Existing Projects into Workspaces -> select root directory ...
设置数据库
选择一个内存数据库
打开yabe/conf/application.conf,去掉下面这行的注释
db=mem #使用内存数据库,使用HSQL
【hsql 数据库是一款纯Java编写的免费数据库,体积小,才563kb。仅一个hsqldb.jar文件就包括了数据库引擎,数据库驱动,还有其他用户界面操作等内容。纯Java设计,又支持 SQL99,SQL2003大部分的标准】
************************************************************************************************************
增加模型User
- package models;
- import javax.persistence.Entity;
- import play.db.jpa.Model;
- @Entity
- public class User extends Model {
- public String email;
- public String password;
- public String fullname;
- public boolean isAdmin;
- public User(String email,String password, String fullname) {
- this.email = email;
- this.password = password;
- this.fullname = fullname;
- }
- }
使用JUNIT进行单元测试
打开命令行,切换到测试模式
play test yabe
play提供了默认的测试文件,打开yabe\test\BasicTest.java
删除aVeryImportantThingToTest,新建一个测试
- import org.junit.*;
- import java.util.*;
- import play.test.*;
- import models.*;
- /**
- * 测试单元 extends UnitTest
- * @author lenovo
- *
- */
- public class BasicTest extends UnitTest {
- @Test
- public void createAndRetriveUser() {
- //Create a User and save
- new User("zs@162.com","******","ZS").save();
- //retrieve User by emial
- User user1 = User.find("email", "zs@162.com").first();
- //两种写法都可以 匹配email="zs@162.com"的User对象
- User user2 = User.find("byEmail", "zs@162.com").first();
- assertNotNull(user1);
- assertNotNull(user2);
- assertEquals(user1, user2);
- assertEquals("ZS", user1.fullname);
- assertEquals("ZS", user2.fullname);
- }
- }
打开http://localhost:9000/@tests
运行BasicTest,即上面写的测试单元,点击Start ! 进行测试
结果应该为绿色!

接下来测试User的email和password是否正确的方法
通过email和password两个条件来找到User对象
打开User.java,添加connect():
- package models;
- import javax.persistence.Entity;
- import play.db.jpa.Model;
- @Entity
- public class User extends Model {
- public String email;
- public String password;
- public String fullname;
- public boolean isAdmin;
- public User(String email,String password, String fullname) {
- this.email = email;
- this.password = password;
- this.fullname = fullname;
- }
- /**
- * 联合email和password两个条件查询User
- * @param email
- * @param password
- * @return
- */
- public static User connect(String email, String password) {
- return find("byEmailAndPassword", email, password).first();
- }
- }
在BasicTest.java里添加测试方法
- import org.junit.*;
- import java.util.*;
- import play.test.*;
- import models.*;
- /**
- * 测试单元 extends UnitTest
- * @author lenovo
- *
- */
- public class BasicTest extends UnitTest {
- /**
- * 测试用户的创建和查找
- */
- @Test
- public void createAndRetriveUser() {
- //Create a User and save
- new User("zs@162.com","******","ZS").save();
- //retrieve User by emial
- User user1 = User.find("email", "zs@162.com").first();
- //两种写法都可以 匹配email="zs@162.com"的User对象
- User user2 = User.find("byEmail", "zs@162.com").first();
- assertNotNull(user1);
- assertNotNull(user2);
- assertEquals(user1, user2);
- assertEquals("ZS", user1.fullname);
- assertEquals("ZS", user2.fullname);
- }
- /**
- * 测试联合条件查询
- */
- @Test
- public void tryConnectUser() {
- //Create a user and save it
- new User("zs@1.com", "123", "zhangsan").save();
- //Test
- assertNotNull(User.connect("zs@1.com", "123"));
- assertNull(User.connect("zs@1.com", "234"));
- assertNull(User.connect("zs@2.com", "234"));
- }
- }
测试BasicTest项,应该全部通过!
增加模型Post
Post类作为博客的实体类,与User之间为多对一的关系
- package models;
- import java.util.Date;
- import javax.persistence.Entity;
- import javax.persistence.Lob;
- import javax.persistence.ManyToOne;
- import play.db.jpa.Model;
- @Entity
- public class Post extends Model {
- public String title;
- public Date postedAt;
- //@Lob标注:声明这是一个超大文本数据类型,用于存储发布的博客内容
- @Lob
- public String content;
- //@ManyToOne:声明Post与User之间是多对一的关系
- //一个用户可以发布多个博客,一个博客只能被一个用户所发布
- @ManyToOne
- public User author;
- public Post(String title, String content, User author) {
- this.title = title;
- this.content = content;
- this.author = author;
- this.postedAt = new Date();
- }
- }
对Post类进行测试
- import org.junit.*;
- import java.util.*;
- import play.test.*;
- import models.*;
- /**
- * 测试单元 extends UnitTest
- * @author lenovo
- *
- */
- public class BasicTest extends UnitTest {
- /**
- * 清空数据库中的数据,释放内存空间
- * Fixtures帮助在测试期间管理数据库
- */
- @Before
- public void setup() {
- Fixtures.deleteDatabase();
- }
- /**
- * 测试用户的创建和查找
- */
- @Test
- public void createAndRetriveUser() {
- //Create a User and save
- new User("zs@162.com","******","ZS").save();
- //retrieve User by emial
- User user1 = User.find("email", "zs@162.com").first();
- //两种写法都可以 匹配email="zs@162.com"的User对象
- User user2 = User.find("byEmail", "zs@162.com").first();
- assertNotNull(user1);
- assertNotNull(user2);
- assertEquals(user1, user2);
- assertEquals("ZS", user1.fullname);
- assertEquals("ZS", user2.fullname);
- }
- /**
- * 测试联合条件查询
- */
- @Test
- public void tryConnectUser() {
- //Create a user and save it
- new User("zs@1.com", "123", "zhangsan").save();
- //Test
- assertNotNull(User.connect("zs@1.com", "123"));
- assertNull(User.connect("zs@1.com", "234"));
- assertNull(User.connect("zs@2.com", "234"));
- }
- /**
- * 测试Post类
- */
- @Test
- public void createPost() {
- //Create a User and save it
- User Mike = new User("ls@1.com", "111", "Mike").save();
- //Create 2 Post
- new Post("First Blog", "first", Mike).save();
- new Post("Second Blog", "second", Mike).save();
- //测试是否成功创建了2个Post对象
- assertEquals(2, Post.count());
- //获取lisi发布的所有博客
- List<Post> posts = Post.find("byAuthor", Mike).fetch();
- assertEquals(2, posts.size());
- assertNotNull(posts.get(0));
- assertNotNull(posts.get(1));
- assertEquals(Mike, posts.get(0).author);
- assertEquals("First Blog", posts.get(0).title);
- assertEquals("second", posts.get(1).content);
- assertNotNull(posts.get(1).postedAt);
- }
- }
增加模型Comment
Comment 与 Post 之间为多对一的关系,多条评论对应一篇博客
- package models;
- import java.util.Date;
- import javax.persistence.Entity;
- import javax.persistence.Lob;
- import javax.persistence.ManyToOne;
- import play.db.jpa.Model;
- @Entity
- public class Comment extends Model {
- public String author;
- public Date postedAt;
- @Lob
- public String content;
- //一篇博客对应多条评论,一个评论属于一篇博客
- //评论与博客的关系:多对一
- @ManyToOne
- public Post post;
- public Comment(String author, String content, Post post) {
- super();
- this.author = author;
- this.content = content;
- this.post = post;
- this.postedAt = new Date();
- }
- }
修改模型Post,增加Comment属性
注:上面的User类也可以持有一个关于Post的集合,方法与此类似。
- package models;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import javax.persistence.CascadeType;
- import javax.persistence.Entity;
- import javax.persistence.Lob;
- import javax.persistence.ManyToOne;
- import javax.persistence.OneToMany;
- import play.db.jpa.Model;
- @Entity
- public class Post extends Model {
- public String title;
- public Date postedAt;
- //@Lob标注:声明这是一个超大文本数据类型,用于存储发布的博客内容
- @Lob
- public String content;
- //@ManyToOne:声明Post与User之间是多对一的关系
- //一个用户可以发布多个博客,一个博客只能被一个用户所发布
- @ManyToOne
- public User author;
- //1篇博客对应多个评论
- //删除某篇博客,则级联删除其评论
- @OneToMany(mappedBy="post", cascade=CascadeType.ALL)
- public List<Comment> comments;
- public Post(String title, String content, User author) {
- this.comments = new ArrayList<Comment>(0);
- this.title = title;
- this.content = content;
- this.author = author;
- this.postedAt = new Date();
- }
- /**
- * 在Post中实现评论的添加保存操作
- * 同时更新Post所持有的Comment的集合!
- */
- public Post addComment(String author, String content) {
- //保存对方
- Comment newComment = new Comment(author, content, this).save();
- //把对方加入到自己管理的集合中
- this.comments.add(newComment);
- //同步到数据库
- this.save();
- return this;
- }
- }
所有的测试代码
- import org.junit.*;
- import java.util.*;
- import play.test.*;
- import models.*;
- /**
- * 测试单元 extends UnitTest
- * @author lenovo
- *
- */
- public class BasicTest extends UnitTest {
- /**
- * 清空数据库中的数据,释放内存空间
- * Fixtures帮助在测试期间管理数据库
- */
- @Before
- public void setup() {
- Fixtures.deleteDatabase();
- }
- /**
- * 测试用户的创建和查找
- */
- @Test
- public void createAndRetriveUser() {
- //Create a User and save
- new User("zs@162.com","******","ZS").save();
- //retrieve User by emial
- User user1 = User.find("email", "zs@162.com").first();
- //两种写法都可以 匹配email="zs@162.com"的User对象
- User user2 = User.find("byEmail", "zs@162.com").first();
- assertNotNull(user1);
- assertNotNull(user2);
- assertEquals(user1, user2);
- assertEquals("ZS", user1.fullname);
- assertEquals("ZS", user2.fullname);
- }
- /**
- * 测试联合条件查询
- */
- @Test
- public void tryConnectUser() {
- //Create a user and save it
- new User("zs@1.com", "123", "zhangsan").save();
- //Test
- assertNotNull(User.connect("zs@1.com", "123"));
- assertNull(User.connect("zs@1.com", "234"));
- assertNull(User.connect("zs@2.com", "234"));
- }
- /**
- * 测试Post类
- */
- @Test
- public void createPost() {
- //Create a User and save it
- User Mike = new User("ls@1.com", "111", "Mike").save();
- //Create 2 Post
- new Post("First Blog", "first", Mike).save();
- new Post("Second Blog", "second", Mike).save();
- //测试是否成功创建了2个Post对象
- assertEquals(2, Post.count());
- //获取lisi发布的所有博客
- List<Post> posts = Post.find("byAuthor", Mike).fetch();
- assertEquals(2, posts.size());
- assertNotNull(posts.get(0));
- assertNotNull(posts.get(1));
- assertEquals(Mike, posts.get(0).author);
- assertEquals("First Blog", posts.get(0).title);
- assertEquals("second", posts.get(1).content);
- assertNotNull(posts.get(1).postedAt);
- }
- /**
- * 测试Post与User的多对一关系
- */
- @Test
- public void testPost2User() {
- User Mike = new User("ls@1.com", "111", "Mike").save();
- Mike.addPost("First Blog", "first");
- Mike.addPost("Second Blog", "second");
- assertNotNull(Mike);
- assertEquals(2, Post.count());
- //从新查询User
- Mike = User.connect("ls@1.com", "111");
- //直接从User中获取Post的集合
- assertEquals(2, Mike.posts.size());
- assertEquals("first", Mike.posts.get(0).content);
- assertEquals("second", Mike.posts.get(1).content);
- }
- /**
- * 测试Comment类
- * 单向,由Comment得到Post
- */
- @Test
- public void testComment() {
- User Mike = new User("ls@1.com", "111", "Mike").save();
- Post post = new Post("First Blog", "first", Mike).save();
- new Comment("jeff", "nice post", post).save();
- new Comment("henrry", "good post", post).save();
- //获取博客的所有评论
- List<Comment> comments = Comment.find("byPost", post).fetch();
- assertEquals(2, comments.size());
- Comment firstComment = comments.get(0);
- assertNotNull(firstComment);
- assertEquals("jeff", firstComment.author);
- assertEquals("nice post", firstComment.content);
- assertNotNull(firstComment.postedAt);
- Comment secondComment = comments.get(1);
- assertNotNull(secondComment);
- assertEquals("henrry", secondComment.author);
- assertEquals("good post", secondComment.content);
- assertNotNull(firstComment.postedAt);
- }
- /**
- * 测试Comment与Post的多对一关系
- * 双向,由Post直接得到与此关联的Comment集合
- */
- @Test
- public void testComment2PostRelation() {
- //User
- User bob = new User("bob@123.com","111","Bob well").save();
- //Post
- Post post = new Post("First post","hello kelly",bob).save();
- //Comment
- post.addComment("jeff", "Nice Post!");
- post.addComment("Tom", "I knew that!");
- assertEquals(1, User.count());
- assertEquals(1, Post.count());
- assertEquals(2, Comment.count());
- //Retrieve Bob's post
- post = Post.find("byAuthor", bob).first();
- assertNotNull(post);
- //Navigation to comments
- assertEquals(2, post.comments.size());
- assertEquals("jeff", post.comments.get(0).author);
- //delete Post
- post.delete();
- //check that all commonts have been deleted
- assertEquals(1, User.count());
- assertEquals(0, Post.count());
- assertEquals(0, Comment.count());
- }
- }
(三)play之yabe项目【数据模型】的更多相关文章
- (九)play之yabe项目【发表博文】
(九)play之yabe项目[发表博文] 博客分类: 框架@play framework 发表一篇博文 填充管理页面 从主页链接到管理页面时,只简单显示了登陆用户的名称 现在对显示的内容加以丰富 ...
- Maven学习总结(三)——使用Maven构建项目
maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Java项目 1.1.创建Java Project 1.使用mvn archet ...
- (四)play之yabe项目【页面】
(四)play之yabe项目[页面] 博客分类: 框架@play framework 主页面 显示当前发表博客的完整内容,以及历史博客列表 Bootstrap Job 一个play job任务就是 ...
- (六)play之yabe项目【验证码】
(六)play之yabe项目[验证码] 博客分类: 框架@play framework 添加验证码功能 在Application.java中添加一个action:captcha() /** * 添 ...
- (八)play之yabe项目【身份验证】
(八)play之yabe项目[身份验证] 博客分类: 框架@play framework 添加身份验证 play提供了一个模块-Secure(安全模块),用来做身份验证 允许Secure模块 修改 ...
- (七)play之yabe项目【CRUD】
(七)play之yabe项目[CRUD] 博客分类: 框架@play framework 增加CRUD功能 使用CRUD能干嘛?----> 在页面对模型进行增删改查操作,这样有什么实际意义 ...
- 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 【转】第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
原文网址:http://www.cnblogs.com/smyhvae/p/4456420.html [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.c ...
- 转】Maven学习总结(三)——使用Maven构建项目
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4240930.html 感谢! maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使 ...
随机推荐
- repo andrid
http://www.cnblogs.com/bluestorm/p/4419135.html
- NPM 与 left-pad 事件:我们是不是早已忘记该如何好好地编程?
转自:http://www.techug.com/npm-left-pad-have-we-forgotten-how-to-program 开发者朋友们,我们该谈一谈这个问题了.你们应该知道本周的 ...
- 转 mv 管道符
需求:想列出指定的内容并将其转移到新的目录中 通过使用mv和管道符有几种方法, 1.file=`ls pattern`;mv $file newdir 2.ls pattern|xargs -i mv ...
- POJ 3320 Jessica's Reading Problem
Jessica's Reading Problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6001 Accept ...
- CommonJS 的 AMD 规范
异步模块定义(Asynchronous Module Definition,简称 AMD)API 描述了一种定义模块的机制,模块及其依赖模块可以通过这种机制进行加载.该机制特别适用于浏览器. 本规范曾 ...
- Maven进价:Maven的安装和目录结构
一.在windows上安装Maven 1.下载 下载地址:http://maven.apache.org/download.html 下载最新版本 maven3.2.5 2.解压 解压地址:F:\Ja ...
- C# 事件和委托
相信大家在面试的时候会经常问到事件和委托的区别,为什么.net中需要事件和委托这样类似的问题吧,对于一些初学者来说可平时用的过程中也不知道为什么, 只知道这样用,而对于其中的实现机制不是很清楚, 所以 ...
- 2014 网选 5011 Game(Nim游戏,数学题)
/* 题意:Nim游戏! 思路:通过异或,判断将n个数表示成二进制的形式之后,是否对应位的数字1 的个数是偶数! */ #include<iostream> using namespace ...
- nodeJS 菜鸟入门
从一个简单的 HTTP 服务开始旅程-- 创建一个 server.js 文件,写入: //最简单的 http 服务例子 var http = require("http"); ht ...
- Spring重点—— IOC 容器中 Bean 的生命周期
一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...