我刚接触hibernate并开始研究hibernate。本章将通过JDBC()使用hibernate。我的第一个问题是 hibernate 是在 内部使用jdbc还是在 内部 使用JTA 执行持久化并获取操作?但是我在这里也可以看到对JTA的提及,例如getCurrentSeessionSession()方法获取与当前JTA事务关联的会话。问题:- 基本上,我想在hibernate状态下了解JTA和jdbc的作用。
问题2:-我可以在hibernate状态下的任何操作中看到以下代码段
try{ session=factory.openSession(); tx=session.beginTransaction(); session.save(myClass); tx.commit(); } finally{ session.close(); }
在这里,我想了解第// tx = session.beginTransaction();行的作用。据了解,每个会话将使用一个连接。因此,即使我们从同一会话中启动多个事务,也将使用相同的连接。一旦我们提交了特定交易,就将从同一会话创建的所有交易都提交一次。那么我们试图用// tx = session.beginTransaction();实现什么??
Hibernate是在内部使用jdbc还是在内部使用JTA来执行持久化和获取操作?
JDBC和JTA不可互换。JDBC是 Java应用程序用于与数据库进行交互的标准API。JTA是用于跨一个或多个资源管理事务的标准API。对于您的问题,最接近的答案是“内部”,Hibernate使用JDBC与数据库进行交互。
像getCurrentSeessionSession()方法一样,获取与当前JTA事务关联的会话。
不完全是。SessionFactory.getCurrentSession()根据当前会话上下文获取会话。该策略的一种实现是JTA会话上下文,它实质上将会话与JTA事务相关联。JTA事务没有“拥有” Hibernate会话,因为JTA对Hibernate一无所知,而且说Hibernate在内部使用JTA也不是很正确。它仅具有与JTA集成并使其管理事务的能力。
在这里,我想了解第// tx = session.beginTransaction();行的作用
它以您正在使用的任何事务处理机制开始事务,该机制由使用中的TransactionFactory控制。例如,对于JDBCTransactionFactory,它仅确保自动提交已关闭,以便在事务完成之前不会提交更改。
一旦我们提交了特定的交易,从同一会话创建的所有交易都将被提交一次。
通常情况下,会话仅与一个事务相关联。多次调用Session.beginTransaction()只会返回相同的基础Transaction。
因此,我们试图通过// tx = session.beginTransaction()实现
就是这样:告诉正在管理交易的任何人,您将开始新的交易。这意味着直到commit()或rollback()为止发生的所有事情都应该具有数据库事务的普遍接受的语义。