第一步:建立一个空的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`));
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帮我们管理外键约束
// Fields private Long userId; private String uname; private String upass; //一个用户可以有多篇文章,所以这个属性是个集合对象 private List<CArticle> articles;
注意原本我们的数据表里面只有3个字段,那么这第四个属性就是JPA替我们维护的事体属性了。
@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是延迟加载
// Fields private Long artId; private String title; private String text; // private Long pubUser; private CUser pubUser;
这次不是添加了,而是把之前的pubUser这个属性由数值型改为了实体型~
// @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); } }
运行这个文件后,我们到数据库查询这两张表,就都已经有了数据: