我刚刚开始我的JPA 2.0研究,我有这段代码:
em = SessionFactory.startSession();
tx = em.getTransaction();
我的问题是:我不确定我是否完全理解使用会话和使用事务之间的区别。在几行中,有谁能告诉我他们之间最大的区别?谢谢!
答案 0 :(得分:103)
你到银行存入2张支票,并提取一笔小额款项。
所以你排队直到柜员打开。
您首次存款。
然后你的第二个。
然后你退出。
现在你已经完成了,你离开了出纳员。
到达出纳员就像创建会话一样,现在你在银行里,准备工作。
每次存款和取款都是他们自己包含的工作,这些都是您的交易。
当您完成工作并离开时,您正在关闭或放弃会话。
所以,从本质上讲,会话中包含您的交易,如果您从未进入银行,那么您无法进行银行存款吗?
答案 1 :(得分:10)
em = SessionFactory.startSession();
在JPA中,没有Session,也没有SessionFactory。 SessionFactory是一个特定于hibernate的接口,如果你使用JPA就不应该使用它(使用Hibernate自己的API或者使用Hibernate作为JPA Provider,但不能同时使用两者。)
答案 2 :(得分:5)
会话是您用来与数据库交互的内容。
交易用于指定会话的边界。
实质上,事务通过仅允许会话一次与其进行交互来防止数据库被破坏。 (它有点复杂,因为你可以从数据库读取许多事务,但只有一个事务正在编写。)
答案 3 :(得分:3)
在Hibernate中,事务管理非常标准,只记得Hibernate抛出的任何异常都是FATAL,你必须立即回滚事务并关闭当前会话。
这是一个Hibernate事务模板:
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
tx.setTimeout(5);
//doSomething(session);
tx.commit();
}catch(RuntimeException e){
try{
tx.rollback();
}catch(RuntimeException rbe){
log.error("Couldn’t roll back transaction", rbe);
}
throw e;
}finally{
if(session!=null){
session.close();
}
}