JPA与hibernate的优缺点
JPA与Hibernate的优缺点
2009-06-19 18:36 yingfang05 javaeye 我要评论(0)字号:T | T
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。本文将对比JPA与Hibernate 的优缺点。
AD:Java Persistence API
从EJB 技术可以开始应用时起,对其在实际应用中的可用性就一直存在怀疑。在我看来,产生这种现象最重要的两个原因是复杂性和资源密集性。结果,随后出现了比EJB 更简单、具有更小资源空间的框架(比如Spring 和Hibernate),并且更快流行开来。为了说明这一点,我们注意到EJB 3.0 规范的方向相对以前出现了一个主要的转变。作为JSR 220 的一部分,该规范提供了类似Plain Old Java Object (POJO) 支持、Dependency Injection(依赖注入)和注释等功能。现在引入了一组全新的API:Java Persistence API (JPA),以允许开发者管理Java EE(甚至SE)应用程序中的关系数据。另外,Sun 声称Java Persistence API 表现了一些Hibernate、TopLink(二者都会在稍后讨论)、JDO 以及EJB 框架中最好的想法。
当前,GlassFish 项目提供了实施JPA 的一个参考,JPA 在GlassFish 应用程序服务器中作为TopLink Essential 部分。您可以在GlassFish 社区页找到该JPA 参考实施。不要混淆TopLink Essentials 和TopLink,前者现在是由Oracle Corporation 拥有的关系映射工具。稍后我将在本文中讨论TopLink 框架。
让我们来讨论一些您应该考虑应用JPA 作为持久化框架的应用场景。
何时考虑将JPA作为持久化框架
您选择从流行的框架(比如Hibernate、TopLink 和EJB)中选择应用具有“好用”的功能且基于标准的框架。
您需要轻量级的持久化框架,且不需要EJB 的容器提供的服务。
您需要可以在标准或Enterprise Java 应用程序中使用的持久化框架。
何时考虑JPA的备选方案
您使用的Java 的版本决定了实际是否可以应用JPA。JPA 是EJB 3.0 规范的一部分,而该规范是Java EE 5 版本的一部分。如果您未更新到Java EE 5,则无法使用JPA。
您的应用程序需要JPA 无法提供的服务,比如那些由EJB 容器提供的服务,在那些情况下您更依赖EJB。
在结束对此框架的讨论前,让我们列出一些使用JPA 作为持久化框架的优势和缺点。
JPA有什么优势?
JPA 是基于标准的。越来越多的提供商期待在不久的将来提供JPA 实施。
它提供了Hibernate 和TopLink 中最好的功能。
它可以和Java SE 和Java EE 应用程序一起使用,需要使用EJB 容器,也可以不要。
JPA有什么缺点?
由于非常新,JPA 规范可能还需要进过重要发展才会变得很稳定。
JPA 是一个规范而不是一个产品。您需要提供商提供一个实施,才能获得这些基于标
准的API 的优势。
Hibernate
Hibernate 是一个对象持久化框架,简化了Java 应用程序和底层关系数据库之间的对象关系映射。方法是提供POJO 的透明持久化,作为“中介”层来提供自动持久化,并从Java 应用程序加载对象到数据库表。借助Hibernate,保存对象状态到数据库和从数据库加载对象状态与调用Java 对象中的方法一样容易。您无需从您的应用程序代码中管理底层的数据操作;Hibernate 框架会为您完成所有的中间步骤。
让我们讨论一些您将会考虑应用Hibernate 作为持久化框架的应用场景,以及那些您将寻求备选方案的应用场景。
何时使用Hibernate作为持久化框架
您正在寻求一个简单的持久化框架,该框架容易学习和使用。在您能够实际开始持久化您的Java 对象到目标数据库之前,您只需要了解几个映射配置文件。
您正在寻求一个非常普通和灵活的持久化框架。Hibernate 的用法非常灵活:无论是否有应用程序服务器都可以使用,无论是否有关系数据库系统也可以使用。
您不想支付获取和维护费用。Hibernate 是开源而且免费的。
Hibernate 框架非常值得应用,因为它非常简单和灵活,同时也很强大。但是,在以下一些应用场景中您可能想要考虑应用其他框架。
何时考虑Hibernate的备选框架
您还不想要其他框架。尽管简单,Hibernate 框架仍然有自己的学习曲线、维护/更新周期,等等。
您需要容器提供的服务,比如那些由EJB 提供的服务,在那些情况下您的选择局限于
EJB。
如果您正在使用或计划使用Hibernate 作为您的持久化框架,这里是一些它的优势和缺点。
Hibernate有什么优势?
Hibernate 易于学习和使用。正如我在上面提到的,在您可以使用它之前,您只需要了解几个简单、自我描述的配置文件。
它非常灵活。您可以在任何需要持久化服务的应用程序架构中使用Hibernate。您可以通过Servlet 和/或Enterprise Java Bean 在Standard Java 应用程序、Enterprise Java 应用程序中使用它。它也可以和Spring 框架很好地集成。
它可以很好地向上扩展,因为它被设计为从底层一直到集群环境中工作。通过类似Lazy Initialization 的技术以及通过CGLIB 运行时间字节代码生成库优化Java 反射,最新版的Hibernate 的性能也得到了加强。
Hibernate有什么缺点?
Hibernate 是另一个拥有自己的应用和维护周期的框架。
尽管有积极的社区支持,但是有时候缺乏专注于此产品的提供商也使得宣传应用此框架显得没有说服力。
spring4.x + hibernate4.x 配置详解
spring4.x + hibernate4.x 配置详解 关于spring和hibernate的使用以及特征等等,在此不再啰嗦,相信大家也都知道,或者去搜索一下即可。 本篇博文的内容主要是我最近整理的关于spring4.x 和hibernate 4.x 相关配置和使用方式,当然spring3.x以及hibernate4.x也可以借鉴。 首先是配置文件web.xml 增加以下代码即可
springmvc框架搭建之xml配置说明(spring4+hibernate4)
SpringMVC框架搭建说明 Spring4.1.4 + hibernate4.3.8 1、web.xml配置 程序运行时从web.xml开始,加载顺序为:context-param -> listener -> filter ->structs (如果使用structs的话)-> servlet 如下为web.xml的配置说明
hibernate学习笔记
第一次课: 持久化:就是把瞬时状态的数据转变为持久化状态的数据,这一个过程就是持久化。 (java中内存分为:栈(变量,方法,形参都是在栈上),堆(new出来的对象在堆上)) 1)瞬时状态:刚new出来,在内存中存在的对象就是瞬时状态的。如果程序结束,对象就会被回收。 2)持久化状态:在磁盘或者是数据库中存在的数据就是持久状态。 Hibernate是什么? 1)是一个优秀的持久化框架,对jdbc进行进一步的封装。(hibernate,ibatis )。 2)是一个ORM (Object relation mapping ). Mysql,oracle,access 是关系型数据库 = hibernate操作的是对象。 使用hibernate的步骤:1)新建项目 2)引入jar包(hibernate最少依赖8个jar包) 3)新建 hibernate配置文件(hibernate.cfg.xml) ,放在src根目录下面。 用于数据库的配置信息。
马士兵hibernate文档 (个人完善版)
3. hibernate.hbm2ddl.auto : 在SessionFactory 创建时,自动检查数据库结构,或者将数据库schema 的DDL 导出到数据库。使用create-drop 时,在显式关闭SessionFactory 时,将删除掉数据库schema。 例如:validate | update | create | create-drop create :如果没有表就创建 update :如果表结构更新,就更新 validate :每次插入表的时候看看表结构有没有更新。 理论上是先建类后建表:这个时候只要你的类建好了,可以跨数据库。 实际中先建表比先建类多,建好表以后要对数据库进行优化,比如建索引,建试图,各种各样的优化。 project\etc目录下面有很多示例性的文档,log4j的文档就在那个下面。 SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); SessionFactory的建立是很耗费时间的,应该像连接池一样,只建立一次,以后要用就直接从那用。 Hibernate文档建议我们自己写一个辅助类,用单例来做。 JUnit的一个bug: @BeforeClass public static void beforeClass() { sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } 在这句话的时候 配置文件如果有的时候写错了,她悄悄把错误隐藏起来了。 解决的方法:可以对这句话加try catch块 8.表名和类名不一致的时候: @Entity @Table(name="_teacher")
注解整理笔记
注解整理笔记 @是java中的注解。 JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 1@SuppressWarnings("serial") 实体类注解例子 2@Entity 3@Table(name = "T_BASE_ROLE") 5@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region = CacheConstants.HIBERNATE_CACHE_BASE) //jackson标记不生成json对象的属性 4@JsonIgnoreProperties (value = { "hibernateLazyInitializer" , "handler","fieldHandler" ,"resources","users"}) public class Role extends BaseEntity implements Serializable { 6@Id 7@GeneratedV alue(strategy = GenerationType.AUTO) 8@Column(name = "ID") public Long getId() { return id;} @Excel(exportName="记录创建者", exportFieldWidth = 30) protected String createUser; 9@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00") @Column(name = "CREATE_TIME", updatable = false) 10@Temporal(TemporalType.TIMESTAMP) public Date getCreateTime() { return createTime;} 11@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = https://www.360docs.net/doc/0e6018651.html,ZY) 12@JoinTable(name = "T_BASE_ROLE_RESOURCE", joinColumns = { @JoinColumn(name = "ROLE_ID") }, inverseJoinColumns = { @JoinColumn(name = "RESOURCE_ID") }) 13@OrderBy("id") public List
Struts+Spring+Hibernate框架搭建
整合SSH框架 整合框架版本:hibernate-distribution-3.6.0.Final-dist + spring-framework-2.5.6.SEC01-with-dependencies + struts-2.1.8.1 一、搭建工具 Windows 、Tomcat 6.0+ 、MyEclipse、SQLServer2008 R2 、Google 二、创建工程 新建WEB项目工程(MyEclipse),包含web.xml配置文件。 三、添加框架环境Junit4 右击新建的项目,选择Build Path —> Add Library —> Junit —> 选择Junit4 —> 确定完成单元测试的添加。 四、添加框架环境Struts2 1.解压struts- 2.1.8.1 ,如下图所示: 可在apps文件里,随机选择一个.war文件解压,到WEB-INF→lib下的基础jar文件:
复制黏贴添加到项目工程的lib下。也可将lib下的全部jar(71个)都复制到项目中来,不过很多用不到。我们崇尚即用即加的原则…… 2. 配置struts.xml和web.xml文件,如下: web.xml:
hibernate_annotation
Hibernate Annotation 使用hibernate Annotation来映射实体 准备工作 下载 hibernate-distribution-3.3.2.GA hibernate-annotations-3.4.0.GA slf4j 导入相关依赖包 Hibernate HOME: \hibernate3.jar \lib\bytecode(二进制) \lib\optional(可选的) \lib\required(必须的) 导入required下的所有jar包 antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.10.jar slf4j-log4j12-1.5.10.jar log4j-1.2.14.jar mysql.jar ---Annotation包 ejb3-persistence.jar hibernate-annotations.jar hibernate-commons-annotations.jar
简单的例子,通过annotation注解来映射实体PO 1、建立(Java Project)项目:hibernate_0100_annotation_HelloWorld_default 2、在项目根下建立lib目录 a)导入相关依赖jar包 antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar ejb3-persistence.jar hibernate-annotations.jar hibernate-commons-annotations.jar hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar log4j-1.2.14.jar mysql.jar slf4j-api-1.5.10.jar slf4j-log4j12-1.5.10.jar 3、建立PO持久化类cn.serup.model.Teacher 内容如下 package cn.serup.model; import javax.persistence.Entity; import javax.persistence.Id; //@Entity表示该是实体类 @Entity public class Teacher { private int id ; private String username ; private String password ; //ID为主键,主键手动分配 @Id public int getId() { return id; } public void setId(int id) { this.id = id;
hibernate关联注解
说明: 本文对hibernate的一对多、多对一、多对多的关联 示例代码是Order类和OrderItem类的一对多的关系 1.一对多 1.1注解方式: @OneToMany 代码示例如下: 双向关联,维护端在“多”的一端 Public class Order implements Serializable { Private Set
hibernate关系映射注解配置
1. Hibernate Annotation关系映射有下面几种类型: 1)一对一外键关联映射(单向) 2)一对一外键关联映射(双向) 3)一对一主键关联映射(不重要,有需要看下文档即可) 在实际中很少用,使用注解@PrimaryKeyJoinColumn 意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用 注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML 映射可以生成。Annotation注解一对一主键关联映,有些bug。不过没空去研究它。 因为在实际开发中一对一很少用。在实际开发中我机会没有用过,主键关联就更少了 4)多对一关联映射(单向) 5)一对多关联映射(单向) 6)一对多关联映射(双向) 7)多对多关联映射(单向) 8)多对多关联映射(双向) 2.介绍各种映射用法 1)一对一外键关联映射(单向)Husband ---> Wife public class Husband{ private Wife wife; @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="wife_id",unique=true) public Wife getWife(){…} … } public class Wife{ } 一对一外键关联,使用@OneToOne,并设置了级联操作 @JoinColum设置了外键的名称为wife_id(数据库字段名),如果不设置,则默认为另一类的属性名+ _id 外键的值是唯一的(unique),不可重复,与另一类的主键一致 2)一对一外键关联映射(双向)Husband <---> Wife public class Husband{ private Wife wife; @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="wife_id",unique=true) public Wife getWife(){…} ... } public class Wife{ private Husband husband; @OneToOne(mappedBy="wife",cascade=CascadeType.ALL) public Husband getHusband(){…} ... } 一对一双向关联关系,使用@OneToOne 注意:需要加上mappedBy="wife",如果不加上的话,Wife也会生成一个外键(husband_id)。mappedby="wife"需要指向与他关联对象的一个属性(即Husband类里面的wife属性),这里的会在Husband表里面生成个外键wife_id字段,而Wife表里则不会生成。这里Husband作为维护端即主
hibernate常用API详解++HQL++SQL
)hibernate常用API详解 分类:Hibernate2013-05-25 18:55 1251人阅读评论(0) 收藏举报转自:https://www.360docs.net/doc/0e6018651.html,/blog/1327883 hibernate常用API详解 以下示例均以两张表为例:member和userinfo,member帐号信息表外键关联userinfo用户基本信息表,主键自动生成即可 然后映射出的POJO如下: public class Userinfo implements Serializable{ // primary key private https://www.360docs.net/doc/0e6018651.html,ng.Integer id; // fields private https://www.360docs.net/doc/0e6018651.html,ng.String name; private https://www.360docs.net/doc/0e6018651.html,ng.String code; private https://www.360docs.net/doc/0e6018651.html,ng.String birthday; private https://www.360docs.net/doc/0e6018651.html,ng.String address; private java.util.Date createTime; private https://www.360docs.net/doc/0e6018651.html,ng.Integer deleteFlag;
// collections private java.util.Set
Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解
在JavaEE企业级开发中,以SSH2框架为核心的应用非常广,大象根据项目实践经验,通过一个实例,详细的为大家讲解如何实现全注解式的开发。 开发环境 JDK1.6.0_18 Eclipse3.2.1 MyEclipse5.1.0 Tomcat6.0.10 MySQL5.0.27 Navicat Lite for MySQL8.1.20 每个人的开发环境可能会有差异,但有一点我需要说明的是,JDK的版本不得低于1.5,因为用到了很多1.5版才支持的新特性。Tomcat和MySQL请不要低于我所用的版本,因为我没在其它的版本上进行测试。Navicat则是MySQL数据库的图形化操作工具。我在这里假定各位目前已经设置好了开发环境,下面就开始详细的说明。 由于要阐述的内容比较多,大象决定将它们划分成个几章节来讲,这一章就主要来说说jar包的选择。 第一部分:选择必须的jar包 新建一个web项目,然后将必要的jar包COPY到lib里面。根据本文实例demo,大象给出下图中的最少jar包配置。 我对这些jar包进行一下说明,方便大家理解。
解压Struts2.1.6的lib文件夹,从中选出上面7个jar包添加到我们的工程库中。commons-logging、freemarker、ognl、struts2-core、xwork这5个还是struts2的核心包。但在Struts2.1.6这个版本中,还需要加上commons-fileupload包。如果没有,则启动就会报错,不过不需要像网上传言的那样还得加上commons-io的jar包,这些大象都亲自做过测试。在本实例中,我将对struts2也采取注解的方式,所以用到了struts2-convention-plugin-2.1.6.jar这个插件。因为要与spring整合,所以struts2-spring-plugin-2.1.6.jar也必不可少。 大象在这里偷个懒,直接将spring的完整jar包加了进来,如果各位想精简类库的话,就选取它的分类jar包吧。比如本例使用struts2作为MVC框架,所以spring的webmvc就不可能用到了。有想改的朋友请自己动手改下。另外有点我想说下,如果采取完整spring的jar包,还需要Spring2.5.6\lib\concurrent文件夹中的backport-util-concurrent.jar,如果不加这个,spring会报错。但是采取spring分类jar包的形式,这个可以不用加,至于具体使用什么需要依赖这个包,大象还没去测试过,这个有待验证。还有lib\slf4j下的日志包,目前很多都开始采用基于slf4j 接口的日志器,它的好处就是日志器是根据slf4j的接口来进行实现,可以在不改变代码的情况下更换日志器。最后Spring的源代码中使用的是commons-logging记录日志,因此这个包不能少,不过因为struts2也用到了,所以这里就省了。 Hibernate从3.3版开始,对jar包结构做了一次大的调整,我们只需要加入lib\required文件夹下面的6个jar包。请注意这6个jar包都是使用Hibernate所必须的。另外再加上hibernate 核心包。这里我将slf4j-api-1.5.2.jar换成了1.5.0,这是因为slf4j是一个通用日志接口,不提供任何实现,我在demo里面使用的是log4j,而hibernate包里面没有log4j的slf4j实现。而且如果版本不一致,会有异常,因此我就采用Spring2.5.6\lib\slf4j里面提供的配套版本。另外我将commons-collections-3.1.jar换成了Struts2.1.6里面的3.2版。
Hibernate注解
Hibernate注解 常用的hibernate annotation标签如下: @Entity --注释声明该类为持久类。 @Table(name="promotion_info") --持久性映射的表(表名="promotion_info)。 @Column(name=”DESC”,nullable=false,length=512) --用于指定持久属性或字段的映射列。 @Id --注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。 @GeneratedValue --定义自动增长的主键的生成策略。 @Transient --将忽略这些字段和属性,不用持久化到数据库。 @Temporal(TemporalType.TIMESTAMP) --声明时间格式。 @Enumerated --声明枚举 @Version --声明添加对乐观锁定的支持 @OneToOne --可以建立实体bean之间的一对一的关联 @OneToMany --可以建立实体bean之间的一对多的关联 @ManyToOne --可以建立实体bean之间的多对一的关联 @ManyToMany --可以建立实体bean之间的多对多的关联 @Formula --一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等) @OrderBy --Many端某个字段排序(List) 下面是对以上常用Hibernate注解标签的详细介绍与举例: @Entity --注释声明该类为持久类。将一个Javabean类声明为一个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的, 要用下面的Transient来注解. @Table(name="promotion_info") --持久性映射的表(表名="promotion_info).@T able是类一级的注解,定义在@Entity下,
Hibernate实现(注解方式)
Hibernate实现(注解方式) 注解方式: 注解的方式与xml很很多类似: 首先是需要加入4个jar包:hibernate-commons-annotations.jar 、 hibernate-annotations.jar ejb3-persistence.jar 、 hibernate-jpa-2.0-api-1.0.1.Final.jar 下面是不同的地方: (1):hibernate.hbm.xml 文件中把引用:xxx.hbm.xml改为引用实体类: 即把: