【JPA+JAX-RS+HTML5】第一弹——用户+文章+评论模块

来源:互联网 发布:发廊手机收银软件 编辑:程序博客网 时间:2024/05/03 13:27

第一步:建立一个空的javaWeb项目

我用的 MyEclipse 2013 Pro,如果与您的版本有出入,自己找替代途径

第二步:设计用户表、文章表、评论表:

数据库名:csdndemo    

MYSQL语句:CREATE DATABASE `csdndemo` /*!40100 DEFAULT CHARACTER SET utf8 */;

ps:MYSQL建schema的时候一定要把默认字符集设置好 ~

c_user表:

userId BIGINT 主键 自增长

uname varchar(45)

upass varchar(45)


MYSQL语句:

CREATE TABLE `csdndemo`.`c_user` (  `userId` BIGINT NOT NULL AUTO_INCREMENT,  `uname` VARCHAR(45) NULL,  `upass` VARCHAR(45) NULL,  PRIMARY KEY (`userId`));


c_article表:

artId BIGINT 主键 自增长

title varchar(255)

text TEXT

pubUser BIGINT 外键关联用户表


MYSQL语句:

CREATE TABLE `csdndemo`.`c_article` (  `artId` BIGINT NOT NULL AUTO_INCREMENT,  `title` VARCHAR(255) NULL,  `text` TEXT NULL,  `pubUser` BIGINT NULL,  PRIMARY KEY (`artId`));



c_comment表

comId BIGINT 主键 自增长

text TEXT

pubUser BIGINT 外键关联用户表

relArt BIGINT 外键关联文章表

MYSQL:

CREATE TABLE `csdndemo`.`c_comment` (  `comId` BIGINT NOT NULL,  `text` TEXT NULL,  `pubUser` BIGINT NULL,  `relArt` BIGINT NULL,  PRIMARY KEY (`comId`));


为什么设计了外键 但是没有添加外键约束?唯一非空约束神马的肿么都没有??别着急,表/实体间的关系我们让JPA来帮我们管理,所以物理表里面只留好相应字段就好啦~

第三步:给项目添加JPA支持:

首先配置下myEclipse的数据库连接,点击MyEclipse-- window--show view --other,找到db browser,

右键,new一个新的连接:

模板选择MYSQL Connector/J

driver name随意选如图:



这里要添加mysql的jdbc 驱动 jar包,网上可以轻松下载到,test一下,确定OK再下一步:

在我们的空工程上右键---myEclipse---Project Facets---Install JPA Facet

选择2.0 点击next

platForm这里,需要说明了,JPA只是一种规范,它的具体实现还是依赖各种实现的,比如hibernate的JPA实现,以及topLink,openJPA等,这里还是选最熟悉的hibnernate4.1实现:

connection 找到我们刚刚配置的那个连接,

第一个勾选上,将jdbc驱动拷贝到我们的项目库中,





这一步完成之后,我们的项目src下面会多出一个META-INF 目录,下面放的就是JPA的持久化配置xml文件啦。


第四步:反向生成实体bean与dao文件:

在db Browser中展开我们刚刚的连接,找到我们的那3张表,分别点击右键,选择 JPA Reverse Engineering...


src folder选择我们的新工程的src目录,如图配置:



反向工程的第三步,为数据库表和实体类的映射,这里要点到这张表,给他个名字,注意是类名不是表名,所以要遵循驼峰命名规则,首字母+每个单词的第一个字母大写。



依次将3张表都反向,然后我们进行第五步。



第五步:分包、添加JPA的事务支持


分包前:

分包后:


如果你也像我一样运气不好有红叉叉,不用管,这只是一个小bug,是新建的schema和table myeclipse还没有适应,不影响运行。


添加支持:

打开3个dao文件,分别在 save delete 和update方法中,做如下修改:(增删改查中,除了查询不需要开启事务以外,增删改都需要事务支持~)

以CArticleDao 为例,save方法添加两行:

 getEntityManager().getTransaction().begin();            getEntityManager().persist(entity);            getEntityManager().getTransaction().commit();
delete方法同样添加两行代码:

entity = getEntityManager().getReference(CArticle.class, entity.getArtId());        getEntityManager().getTransaction().begin();            getEntityManager().remove(entity);            getEntityManager().getTransaction().commit();

update方法同理


getEntityManager().getTransaction().begin();            CArticle result = getEntityManager().merge(entity);            getEntityManager().getTransaction().commit();
好了,完成这里就可以开始第六步了.



第六步:分析实体关系,让JPA帮我们管理外键约束

这一步分析比实践更重要!
我们这里的例子是  用户——文章——评论,那么他们的关系分别是:
1.一个用户可以发布多篇文章,一篇文章只能有一个作者。      这是1-N关系
2.一个用户可以发布多条评论,一条评论页只能有一个发布者,还是1-N关系
3.一篇文章可以有多条评论,一条评论只能针对一篇文章,还是1-N关系....
好吧,目前3个实体的关系全是1-N关系~~太没有示范意义了,不过没关系,如果说我们加入好友功能:
一个用户(user表)可以有多个好友(还是user表),这是典型的 user表自身的N-N关系~鉴于此文想先从简单开始,后面我们在详述好友模块


分析好实体关系后,我们就要打开实体文件了,以 user表为例,user-article是1-N关系:
  // Fields         private Long userId;     private String uname;     private String upass;          //一个用户可以有多篇文章,所以这个属性是个集合对象     private List<CArticle> articles;

注意原本我们的数据表里面只有3个字段,那么这第四个属性就是JPA替我们维护的事体属性了。


然后为这个list 属性添加 getter/setter:


@Column(name="upass", length=45)    public String getUpass() {        return this.upass;    }        public void setUpass(String upass) {        this.upass = upass;    }public List<CArticle> getArticles() {return articles;}public void setArticles(List<CArticle> articles) {this.articles = articles;}   
接下来是添加注解了,对于user来讲,这是1-n关系,即OneToMany,所以在get方法上方添加:
@OneToMany(fetch=FetchType.LAZY,mappedBy="pubUser",cascade=CascadeType.ALL)public List<CArticle> getArticles() {return articles;}

括号中的第一个修饰表示如果我们没有去调用user.getArticles方法,是不会去做这个外键查询的,LAZY是延迟加载
第二个修饰表示这个1-n关系的外键是CArticle类的pubUser这个属性
第三个修饰表示 我们让user表来维护article表,即:
所有属于该用户的文章,一旦该用户被保存,则文章被保存(CascadeType.persist)
所有属于该用户的文章,一旦该用户被删除,则这些文章一起被删除(CascadeType.remove)
我们选择ALL,就把他们都包括了。



再到CArticle 实体类中:

   // Fields         private Long artId;     private String title;     private String text;    // private Long pubUser;     private CUser pubUser;

这次不是添加了,而是把之前的pubUser这个属性由数值型改为了实体型~
同样的,要修改getter setter中的类型,以及构造函数中的类型,这里就不罗列了。
然后修改getter上方的注解:


 // @Column(name="pubUser")    //修改为:    @ManyToOne(fetch=FetchType.LAZY)    @JoinColumn(name="pubUser")    public CUser getPubUser() {        return this.pubUser;    }        public void setPubUser(CUser pubUser) {        this.pubUser = pubUser;    }   

对于user来讲 关系是1-N,那么对于文章来讲,关系自然是N-1了,所以这里的注解是@ManyToOne。
好了 用户-文章关系我们已经修改好了~,可以测试一下了


测试类:
package com.csdn.test;import java.util.ArrayList;import com.csdn.dao.CUserDAO;import com.csdn.entity.CArticle;import com.csdn.entity.CUser;public class UnitTest {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub//创建第一个用户CUser u=new CUser();u.setUname("admin");u.setUpass("admin");//第一个用户写了第一篇文章CArticle art=new CArticle();art.setText("大家好,我是一片文章");art.setTitle("大家好,我是标题");art.setPubUser(u);//让admin拥有这篇文章ArrayList<CArticle> list=new ArrayList<CArticle>();list.add(art);u.setArticles(list);//保存这个用户的同时,这篇文章会一起保存CUserDAO dao=new CUserDAO();dao.save(u);}}

运行这个文件后,我们到数据库查询这两张表,就都已经有了数据:



1 0
原创粉丝点击