博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA与Hibernate(转)
阅读量:5363 次
发布时间:2019-06-15

本文共 2249 字,大约阅读时间需要 7 分钟。

Java Persistence API ,Java EE 5 的标准ORM接口,也是EJB3( 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。EJB是sun的服务器端组件模型,设计目标与核心应用是部署分布式应用程序。)规范的一部分。通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期实体对象持久化到数据库中去。

Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的超集。

JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。那么Hibernate是如何实现与JPA 的这种关系的呢。Hibernate主要是通过三个组件来实现的,及hibernate-annotation、hibernate- entitymanager和hibernate-core。

hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及Hibernate自身特殊功能的annotation。

hibernate-core是Hibernate的核心实现,提供了Hibernate所有的核心功能。

hibernate-entitymanager实现了标准的JPA,可以把它看成hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范

hibernate-entitymanager包的主要类及实现。

HibernatePersistence.java,实现了JPA的PersistenceProvider接口,它提供 createEntityManagerFactory和createContainerEntityManagerFactory两个方法来创建 EntityManagerFactory对象,这两个方法底层都是调用的EJB3Configuration对象的 buildEntityManagerFactory方法,来解析JPA配置文件persistence.xml,,并创建 EntityManagerFactory对象。

EntityManagerFactory对象的实现是EntityManagerFactoryImpl类,这个类有一个最重要的private 属性就是Hibernate的核心对象之一SessionFactory。这个类最重要的方法是createEntityManager,来返回 EntityMnagaer对象,而sessionFactory属性也传入了该方法。

EntityManager对象的实现是EntityManagerImpl类,这个类继承自AbstractEntityManagerImpl 类,在AbstractEntityManager类中有一个抽象方法getSession来获得Hibernate的Session对象,正是在这个 Session对象的实际支持下,EntityManagerImpl类实现了JPA的EntityManager接口的所有方法,并完成实际的ORM操 作。

此外,hibernate-entitymanager包中还有QueryImpl类利用EntityManagerImpl的支持实现了JPA的 Query接口;TransactionImpl利用EntityManagerImpl的支持实现了JPA的EntityTransaction接口。

至此,Hibernate通过hibernate-entitymanager包完成了对于JPA的全部支持工作。

问题:

JPA中的Query对象的getSingleResult()方法,当查询不到结果时,抛出NoResultException、当查询到多个结 果时,抛出NonUniqueResultException;并且NoResultException和 NonUniqueResultException都是RuntimeException。

这样有两个问题:

1、我认为getSingleResult方法应该允许查询不到结果的情况存在的,此时它返回null即可,没有必要抛出异常;

2、即使需要在查询不到结果或者查询到多个结果时抛出异常,也不应该抛出RuntimeException,因为这样表示不需要代码显示的用try-catch块来捕获这些异常,也就不会引起用户对这两个异常的重视。

目前解决这个问题我使用的方法是

try{ Object o = query.getSingleResult(); } catch (NoResultException ex){ return null; } catch(NonUniqueResultException ex) { o = queryObject.getResultList();return ((List)o).get(0);}

 

原文出处:

转载于:https://www.cnblogs.com/m3Lee/p/3373472.html

你可能感兴趣的文章
Oracle session相关数据字典(一)
查看>>
织梦文章内容提取第一张或者多张图片输出
查看>>
C#用正则表达式 获取网页源代码标签的属性或值
查看>>
BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
查看>>
WCF(一) 简单的认知
查看>>
[MFC][DShow]简单例子
查看>>
js onclick事件传参
查看>>
WiCloud 商业Wi-Fi管理平台
查看>>
团队项目--未完待续
查看>>
双重标准,我该怎么解决
查看>>
python中的网页标签等字符处理
查看>>
Linux常用命令(十二)
查看>>
Linux常用命令(十五)
查看>>
Linux常用命令(十四)
查看>>
Linux常用命令(十七)
查看>>
Linux常用命令(十六)
查看>>
Linux常用命令(二十四)
查看>>
4种java定时器
查看>>
Vue.js 教程
查看>>
linux 设置网卡
查看>>