- 浏览: 106905 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (134)
- java (134)
- [转]sqlserver 数据类型 及使用考虑 (1)
- 保存、读取、删除到sdcard图片 (1)
- hashcode 重写 (1)
- sql2008导出数据 (1)
- Android开发(1):随机绘制彩色实心圆 (1)
- JPA 应用技巧 1:实体类和实体 DAO 模板 (1)
- 狩魂之神即将开测 - 2012年最值得期待的网页游戏 (1)
- mantis (1)
- MediaWiki (1)
- ExtMail (1)
- MDaemon搭建公司项目环境 (1)
- NIO 之 选择就绪模式 (1)
- web应用系统架构设计 (1)
- XML CDATA (1)
- firefox+Firebug调试JavaScript、HTML和CSS (1)
- 在SUSE 11中安装Windows虚拟机 (1)
- 将字节流(byte[])转换成文件 (1)
- HTML5网站 (1)
- 在Android中自定义IOS风格的按钮 (1)
- 基于SVG的WebGIS的一个雏形 (1)
- 程序名称DreamIT(梦想IT)提供许多IT公司的面试和笔试试题 (1)
- 介绍一个ASP.NET开发工具Web Matrix (1)
- C#信息采集工具实现 (1)
- Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布 (1)
- 2011面试题目之猴子偷桃 (1)
- Linux tar压缩时排除某个目录或文件的参数 (1)
- Crack JRebel 4.0,无需重启JVM,热部署解决方案 (1)
- Groovy Sql使用Spring的事务管理 (1)
- <<让oracle跑的更快1>>读书笔记2 (1)
- 不要再浪费时间 (1)
- JSP (1)
- PHP (1)
- Python (1)
- Ruby (1)
- Perl概要及各自特点 (1)
- JVM 内存结构(转) (1)
- [转载]JPA 批注参考(1) (1)
- Hadoop配置部分内容 (1)
- HD2刷机的基础知识 HD2的radio、HSPL、ROM三种组合 (1)
最新评论
-
alexyao8:
顶起
[G4Studio开源平台]如何搭建G4开发环境 -
greatghoul:
太二了。
不要再浪费时间 -
wengbo316:
它们一定是花果山的猴子,数数能数到3K多呢。。。
2011面试题目之猴子偷桃 -
mycar:
额.待补充...........
保存、读取、删除到sdcard图片 -
沙舟狼客:
这太折磨人了, 还有人要看吗?
[] javaeye rss抓取
JPA 应用技巧 1:实体类和实体 DAO 模板
Posted on 2011-09-07 17:40 蜀山兆孨龘 阅读(1512) 评论(8) 编辑 收藏 所属分类: Java EE
最近闲来无事(楼主确实太懒了),重翻旧账,捣鼓了下 JPA 2.0,通过不断地写代码和谷歌,又有了一些旧瓶装新酒的发现和吐槽。楼主将在这一系列文章中慢慢道来。本次开篇带来的是两个模板类:用作实体类基础框架的 AbstractEntity, 以及实现了对实体的基本 CRUD 操作的 BasicEntityDao。
一个实体类必须实现 java.io.Serializable 接口,必须有一个 ID 字段作为主键,且最好覆盖 equals 和 hashCode 方法。因为实体类和数据表有对应关系,所以往往根据 ID 来实现 equals 和 hashCode。这很自然地可以引出一个模板类,所有的实体类都可以从它继承:
/**
* 该类可作为实体类的模板,其 {@link #equals(Object)} 和 {@link hashCode()} 方法基于主键实现。
* 子类只需要实现 {@link #getId()} 方法。
*/
public abstract class AbstractEntity implements Serializable {
/**
* 返回主键。
*/
public abstract Object getId();
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
return getId() == null ? false
: getId().equals(((AbstractEntity) obj).getId());
}
@Override
public int hashCode() {
return Objects.hashCode(getId());
}
}
针对主键的类型,AbstractEntity 可以进一步扩展。例如,可以扩展出一个 UuidEntity,它使用随机生成的 UUID 作为主键:
@MappedSuperclass
public class UuidEntity extends AbstractEntity {
@Id
private String id;
@Override
public String getId() {
return id;
}
@PrePersist
private void generateId() {
// 仅在持久化前生成 ID,提升一点性能。
id = UUID.randomUUID().toString();
}
}
继续发挥想象,让它支持乐观锁:
@MappedSuperclass
public class VersionedUuidEntity extends UuidEntity {
@Version
private int version;
}
这儿顺便插嘴吐槽下主键的类型。用整数还是 UUID 好呢?这个问题在网上也是争论纷纷。在楼主看来,两者各有优劣:整数主键性能高,可读性也好,但会对数据迁移,例如合并两个数据库,造成不小的麻烦,因为可能出现一大堆重复的主键;UUID 性能差些,看起来晃眼,虽然据说有些数据库针对性地做了优化,想来也不大可能优于整数,不过好处就是理论上出现重复主键的概率比中彩票还小(福彩除外)。说这么一大堆,其实还是蛮纠结啊……楼主一般倾向于用 UUID,只要服务器的配置够劲,想来不会出现明显的性能问题。
接下来说说 BasicEntityDao,它提供了基本的 CRUD 实现,可以用来为会话 Bean 做模板:
/**
* 提供了对实体进行基本 CRUD 操作的实现,可作为会话 Bean 的模板。
*/
public abstract class BasicEntityDao<T> {
private Class<T> entityClass;
private String entityClassName;
private String findAllQuery;
private String countQuery;
protected BasicEntityDao(Class<T> entityClass) {
this.entityClass = Objects.requireNonNull(entityClass);
entityClassName = entityClass.getSimpleName();
findAllQuery = "select e from " + entityClassName + " e";
countQuery = "select count(e) from " + entityClassName + " e";
}
/**
* 返回用于数据库操作的 {@link EntityManager} 实例。
*/
protected abstract EntityManager getEntityManager();
public void persist(T entity) {
getEntityManager().persist(entity);
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
return getEntityManager().createQuery(findAllQuery, entityClass).getResultList();
}
public List<T> findRange(int first, int max) {
return getEntityManager().createQuery(findAllQuery, entityClass)
.setFirstResult(first).setMaxResults(max).getResultList();
}
public long count() {
return (Long) getEntityManager().createQuery(countQuery).getSingleResult();
}
public T merge(T entity) {
return getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(merge(entity));
}
}
子类只需要提供 getEntityManager() 的实现即可。假设楼主要做一个养鸡场管理系统,对鸡圈进行操作的会话 Bean 就可以简单地写成:
@Stateless
public class CoopDao extends BasicEntityDao<Coop> {
@Persistence
private EntityManager em;
public CoopDao() {
super(Coop.class);
}
@Override
protected EntityManager getEntityManager() {
return em;
}
// 更多方法……
}
发表评论
-
HD2刷机的基础知识 HD2的radio、HSPL、ROM三种组合
2012-02-07 15:13 1039今天看着教程刚刷了台HD2,觉得有用的文章顺便转载过来 ... -
Hadoop配置部分内容
2012-02-04 15:29 698[size=medium;]Hadoop配置部分内容[ ... -
[转载]JPA 批注参考(1)
2012-02-04 11:39 689作为 Java 企业版 5 ... -
JVM 内存结构(转)
2012-02-03 14:49 853http://www.4ucode.com/Study ... -
JSP,PHP,Python,Ruby,Perl概要及各自特点
2012-01-31 15:18 946互联网技术日新月异,编程的语言层出不穷,原本稍微平静了 ... -
不要再浪费时间
2012-01-31 15:08 847不要再浪费时间 &l ... -
<<让oracle跑的更快1>>读书笔记2
2012-01-11 13:24 9831 绑定变量 1 ... -
Groovy Sql使用Spring的事务管理
2011-12-28 18:43 1219Grails如果不想用Hibernate的东东,可以直 ... -
Crack JRebel 4.0,无需重启JVM,热部署解决方案
2011-12-28 18:28 1129http://dl.dropbox.com/u/229 ... -
Linux tar压缩时排除某个目录或文件的参数
2011-12-21 13:48 1259在对某个目录进行压缩的时候,有时候想排除掉某个目录,例 ... -
2011面试题目之猴子偷桃
2011-12-21 11:14 1428<span style="" ... -
Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布
2011-12-20 14:53 1530首先是准备工作 ... -
C#信息采集工具实现
2011-12-20 12:34 839简单C#信息采集工具实现 最近想整只爬虫玩玩,顺便熟 ... -
介绍一个ASP.NET开发工具Web Matrix
2011-12-19 09:49 888想学习或者开发个小型的ASP.NET程序,装个VS.N ... -
程序名称DreamIT(梦想IT)提供许多IT公司的面试和笔试试题
2011-12-19 09:24 865<font style="bac ... -
基于SVG的WebGIS的一个雏形
2011-12-14 13:19 629我和一位师弟,经过了很多天的努力,终于做出了一个简单的 ... -
在Android中自定义IOS风格的按钮
2011-12-12 10:09 1060<p class="MsoNorm ... -
HTML5网站
2011-12-12 08:55 768记得刚来现在公司的时候,老大就说,作为移动平台部门的员 ... -
将字节流(byte[])转换成文件
2011-12-09 08:25 1451/** * 将字节流转换成文件 * @par ... -
在SUSE 11中安装Windows虚拟机
2011-12-09 01:29 858Novell公司最近推出 ...
相关推荐
由于模板Dao的实现,使得这些具体实体的Dao层已经变的非常“薄”,有一些具体实体的Dao实现可能完全就是对模板Dao的简单代理,并且往往这样的实现类可能会出现在很多实体上。Spring-data-jpa的出现正可以让这样一个...
生成实体类 生成WEB API相关接口 Controller 生成业务逻辑相关的Service/ServiceImpl 生成操作数据库的Dao接口与Mapper.xml映射文件 生成单元测试等 软件最大的特色就是操作SQL类的Assist查询帮助类(Assist是...
项目知识详解: 整体项目基于springboot框架开发 数据库采用了mysql 以及 JPA 实现对数据库的链接 ...依次是javabean,配置类,contrler层,dao层,实体类,异常定义,异常处理,拦截类,service层,工具类
这些实体类与数据库表建立的映射关系,提供通用的CRUD操作API,能够自动生成预先SQL语句并执行,使用者可以通过针对对象的思维方式来轻松完成增删改查的操作。 它具有以下特点: 开箱即用 EasyJpa上手简单,只要有...
linjiashop-generator 代码生成模块,根据实体生成dao,service,后台管理的controller和页面,配合IDEA 代码生成插件webflash-generator使用效果更好,使用前请仔细阅读该文档 源码更新日志: linjiashop商城系统 ...
13.2.2 使用反向工程生成JPA实体类和DAO类 234 13.2.3 调整生成的实体类标注 237 13.2.4 使用JPA功能 238 13.3 MyEclipse中支持JPA规范的工具 238 13.3.1 JPA透视图 239 13.3.2 JPA标注配置视图 239 13.3.3 JPA代码...
Spring-generator 是基于 javafx8 开发的图形界面 Spring 代码生成器,使用 Apache FreeMarker 作为代码文件的模板,用户可以一键将...生成的实体类(可以自己修改模板按自己的风格生成): Dao 接口: Mapper.xml 文件:
依次是javabean,配置类,contrler层,dao层,实体类,异常定义,异常处理,拦截类,service层,工具类 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200604160124781.png?x-oss-process=image/watermark,...
生成实体类 生成WEB API相关接口 Controller 生成业务逻辑相关的Service/ServiceImpl 生成操作数据库的Dao接口与Mapper.xml映射文件 生成单元测试等 软件最大的特色就是操作SQL类的Assist查询帮助类(Assist是...
5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java...
5.3.3使用spring对jdbc的dao支持类 5.4在spring里集成hibernate 5.4.1选择hibernate的版本 5.4.2使用hibernate模板 5.4.3建立基于hibernate的dao 5.4.4使用hibernate3上下文会话 5.5spring和java持久api ...
5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java...
linjiashop是一个基于...linjiashop-generator 代码生成模块,根据实体生成dao,service,后台管理的controller和页面,配合IDEA 代码生成插件webflash-generator使用效果更好,使用前请仔细阅读该文档linjiashop截图
Generator 是一款基于数据库表生成Java代码的工具,代码模板使用当前主流Java框架: Spring, SpringMVC, Mybatis(Mybatis-Plus、JPA) 组织,能够减少繁琐的重复性工作,让开发人员更专注于技术和性能,提高工作...
linjiashop-generator 代码生成模块,根据实体生成dao,service,后台管理的controller和页面,配合IDEA 代码生成插件webflash-generator使用效果更好,使用前请仔细阅读该文档 linjiashop商城系统 更新日志: v...
实体类通过“服务的两种结构模式”定义,然后遵循dao,然后使用Maven构建工具来管理项目体系结构中的类,资源和依赖项。 登录或注册您必须先登录后才能自动打开该页面,而无需登录就无法打开任何其他页面。 主页...