(三)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作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使 ...
随机推荐
- wordpress添加文章浏览统计(刷新不重复)
wordpress本身不带文章浏览统计,可以用插件wp-postview,但是刷新还是算一个浏览次数. 1.首先在主题下functions.php里增加以下代码,这段代码也是网上可以找到的 //add ...
- python高效解析日志入库
python脚本解析日志文件入库一般有三个重要的步骤:读文件.解析文件.入库.在这三个方面下功夫,可确保我们获得最优的性能(这里不讨论并发) 1 读文件:一次读一行,磁盘IO太多,效率低下:一次性读如 ...
- 明天去FDUSC报道了,GOD BLESS ALL OF US
@lrb @tellmewtf @proverbs
- 关于welcome-file-list(欢迎页)不起作用的解决办法
今天我遇到了一个问题,就是直接输入http://localhost:8080/xxx-admin/,不是跳转到index.html,而是报404找不到的错误,根据错误信息看明显是没有跳转到index. ...
- 关于 iOS 的一些学习资料
iOS.Book.Effective Objective-C 2.0 1. 中文翻译版 (更新中) https://github.com/HagerHu/effective-objective-c-2 ...
- 【HTML】Iframe中的onload事件
当iframe.src重新指定一个url时会重新执行iframe的onload事件 <iframe id="indexFrame" name="index" ...
- 修复AWS上EC2损坏的sshd_config文件
常识: AWS是没有root用户的,登陆也都是通过SSH KEY完成授权认证. 背景: 正在AWS上搭一个CI (GO),与gitlab,为了将其进行集成,需将gitlab的deploy key设置成 ...
- 基于 Markdown 的开源的 Node.js 知识库平台
Raneto 是一个免费,开源的 Node.js 知识库平台,基于静态 Markdown 文件实现. Raneto 可以被称为静态网站生成器,因为它并不需要数据库支持.所有的内容都存储在 Markdo ...
- Mergely – 免费的在线文档对比和合并工具
任何类型的文件(无论是否代码),我们可能要比较不同的版本,看发生了什么变化. 有些编辑器都有这个内置功能,其中一些则没有. Mergely 是一个免费使用的 Web 应用程序,帮你你迅速作出文档的差异 ...
- Mobiles Wall – 致力于分享最优质的手机壁纸
大多数人都经常修改手机壁纸,让收集看起来更酷.Mobiles Wall 是一个响应式的网站,致力于分享最优质的手机壁纸,类型非常多,包括:抽象,动物,艺术,汽车,食品及饮料,游戏,照片,电影,音乐,自 ...