- 浏览: 113448 次
- 性别:
- 来自: 成都
-
文章分类
- 全部博客 (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 1125今天看着教程刚刷了台HD2,觉得有用的文章顺便转载过来 ... -
Hadoop配置部分内容
2012-02-04 15:29 751[size=medium;]Hadoop配置部分内容[ ... -
[转载]JPA 批注参考(1)
2012-02-04 11:39 737作为 Java 企业版 5 ... -
JVM 内存结构(转)
2012-02-03 14:49 923http://www.4ucode.com/Study ... -
JSP,PHP,Python,Ruby,Perl概要及各自特点
2012-01-31 15:18 1014互联网技术日新月异,编程的语言层出不穷,原本稍微平静了 ... -
不要再浪费时间
2012-01-31 15:08 927不要再浪费时间 &l ... -
<<让oracle跑的更快1>>读书笔记2
2012-01-11 13:24 10361 绑定变量 1 ... -
Groovy Sql使用Spring的事务管理
2011-12-28 18:43 1310Grails如果不想用Hibernate的东东,可以直 ... -
Crack JRebel 4.0,无需重启JVM,热部署解决方案
2011-12-28 18:28 1187http://dl.dropbox.com/u/229 ... -
Linux tar压缩时排除某个目录或文件的参数
2011-12-21 13:48 1326在对某个目录进行压缩的时候,有时候想排除掉某个目录,例 ... -
2011面试题目之猴子偷桃
2011-12-21 11:14 1529<span style="" ... -
Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布
2011-12-20 14:53 1631首先是准备工作 ... -
C#信息采集工具实现
2011-12-20 12:34 945简单C#信息采集工具实现 最近想整只爬虫玩玩,顺便熟 ... -
介绍一个ASP.NET开发工具Web Matrix
2011-12-19 09:49 991想学习或者开发个小型的ASP.NET程序,装个VS.N ... -
程序名称DreamIT(梦想IT)提供许多IT公司的面试和笔试试题
2011-12-19 09:24 938<font style="bac ... -
基于SVG的WebGIS的一个雏形
2011-12-14 13:19 699我和一位师弟,经过了很多天的努力,终于做出了一个简单的 ... -
在Android中自定义IOS风格的按钮
2011-12-12 10:09 1106<p class="MsoNorm ... -
HTML5网站
2011-12-12 08:55 829记得刚来现在公司的时候,老大就说,作为移动平台部门的员 ... -
将字节流(byte[])转换成文件
2011-12-09 08:25 1545/** * 将字节流转换成文件 * @par ... -
在SUSE 11中安装Windows虚拟机
2011-12-09 01:29 915Novell公司最近推出 ...
相关推荐
6. **其他功能**:高级的实体类生成器可能还包括代码格式化、重命名规则、多数据库支持、生成DAO和Service层代码等功能。 7. **使用方式**:实体类生成器可以是命令行工具、IDE插件或者Web服务的形式,开发者输入...
在这个项目中,源代码可能包括了Spring的配置文件(如`applicationContext.xml`)、JPA的实体类、以及使用Tiles定义的视图组件。 **集成要点:** 1. **JPA集成**:在Spring配置文件中,需要配置JPA的...
在实际开发中,使用MyEclipse或其他类似工具自动生成DAO层、实体类和映射文件有以下优势: 1. 提高开发效率:避免了手动编写重复的模板代码,使开发者能够更快地完成基础架构。 2. 减少错误:由工具自动生成的代码...
5. **注释和序列化支持**:为了提高代码可读性和与其他框架的兼容性,生成的实体类可能还包括JPA的注解(如@Entity、@Id等)和Java Serializable接口。 6. **文件输出**:最后,工具将生成的实体类代码保存到指定的...
使用JPA,我们需要定义实体类(Entity),它们映射到数据库表。例如,一个名为`User`的实体: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;...
4. 数据库实体类:使用Hibernate注解,如@Entity、@Table等,与数据库表进行映射。 5. JpaRepository接口:定义数据库操作,Spring Data JPA会自动生成实现。 6. Service层接口及实现:业务逻辑处理,调用Jpa...
在Java开发中,实体类是数据访问层(DAO)和业务逻辑层(Service)之间的重要桥梁,它们代表了数据库中的表或者记录。实体类生成器源码的目的是提高开发效率,避免手动编写重复的getter、setter、构造函数以及equals...
JPA的配置则通常在persistence.xml文件中,这里会定义实体类和数据源等信息。 在实际操作中,首先需要添加相应的依赖库,包括Struts2、Spring、Hibernate(JPA的实现)以及其他必要的库。在项目结构中,可能有一个...
标题“springboot-jpa加上jdbctemple”指的是在Spring Boot项目中同时使用JPA(Java Persistence API)和JdbcTemplate的技术整合。这是一个常见的后端开发场景,涉及到Spring Boot的数据库访问层的构建,旨在提供...
- 定义JPA实体类,并使用Hibernate的注解进行映射。 - 创建Spring的DAO或Repository接口,利用JPA的Query方法进行数据查询。 - 在Velocity模板中,通过Spring的Model传递数据,生成动态内容。 这样的整合使得开发者...
使用JPA的注解(如@Entity、@Table、@Id等)来定义实体类,并配置ORM映射。 4. **拦截器配置**:可以利用Spring的AOP功能,为Struts2添加自定义拦截器,实现业务逻辑的预处理和后处理。 5. **测试与优化**:完成...
标题“spring2.5+jpa”表明我们正在讨论一个关于Spring框架2.5版本...压缩包中的“jpa-me-blank”可能是项目的基础结构或模板,可能包含配置文件、实体类、DAO接口等,进一步研究这个文件将有助于理解实际的项目设置。
由于模板Dao的实现,使得这些具体实体的Dao层已经变的非常“薄”,有一些具体实体的Dao实现可能完全就是对模板Dao的简单代理,并且往往这样的实现类可能会出现在很多实体上。Spring-data-jpa的出现正可以让这样一个...
JPA 规范定义了一系列接口和注解,用于描述实体类与数据库表之间的映射关系,并提供了基本的数据访问功能。 #### 二、JPA 相关库介绍 为了开发基于 JPA 的应用程序,我们需要依赖一系列的库文件。下面详细介绍这些...
1. **实体类(Entity)**:DEMO中应该有一个名为`User`的实体类,它包含了用户的基本信息,如ID、用户名、密码等属性,并使用JPA的注解(如`@Entity`, `@Id`, `@GeneratedValue`等)进行标记。 2. **Repository接口...
2. **JPA 配置**:设置 JPA 的实体类,定义数据模型,并配置 persistence.xml 文件来指定数据源、实体类和持久化单元。可能还涉及事务策略的设定,如使用 Spring 的 PlatformTransactionManager。 3. **DAO 和 ...
开发者可以使用注解或XML配置来定义实体类,JPA会自动处理SQL查询、事务管理和对象状态管理。 **Struts1框架** Struts1是最早的MVC(模型-视图-控制器)框架之一,用于构建Web应用程序。它将业务逻辑、表示层和控制...
2. **定义实体类** 使用JPA注解(例如@Entity、@Table、@Id等)创建Java对象,这些对象将映射到SQL Server的表。 3. **配置JPA** 在Spring Boot的配置类中,可以自定义JPA配置,如实体扫描路径、事务管理器等。 ...
3. 实体类(Entity)将对应数据库表,用于持久化数据。 4. Repository接口将继承自Spring Data JPA提供的基类,如`JpaRepository`,并可能包含自定义查询方法。 5. Service层将调用Repository接口,处理业务逻辑。 6...
此外,可能还需要编写DAO接口和实现类,使用JPA或Hibernate的API进行数据操作。 通过这篇博文链接(虽然此处未给出实际链接),开发者可以学习到如何将这三个框架集成到一个项目中,包括如何设置相应的Maven或...