我是hibernate的新手并开始研究hibernate。我将通过JDBC()使用hibernate。我的第一个问题是 hibernate内部使用jdbc或内部使用JTA 来执行持久化和获取操作吗? 但我在这里也可以看到一些JTA,比如getCurrentSeessionSession()方法获取与当前JTA事务关联的会话。问题: - 基本上我想了解JTA和jdbc在hibernate中的作用。
问题2: - 我可以在hibernate的任何操作中看到下面的代码片段try{
session=factory.openSession();
tx=session.beginTransaction();
session.save(myClass);
tx.commit();
}
finally{
session.close();
}
在这里,我想了解一下// tx = session.beginTransaction();根据理解,每个会话将使用一个连接。甚至 如果我们从同一个会话启动多个事务,我们将使用相同的连接。一旦我们提交了特定交易的所有交易 从同一会话创建的将被提交一次。那么我们用// tx = session.beginTransaction()来实现什么呢? ?
答案 0 :(得分:17)
hibernate内部使用jdbc还是内部使用JTA执行持久化和获取操作?
JDBC和JTA不可互换。 Java应用程序用来与数据库交互的JDBC is the standard API。 JTA is the standard API用于管理跨一个或多个资源的事务。对你的问题最接近的答案是“内部”,Hibernate使用JDBC与数据库进行交互。
与getCurrentSeessionSession()方法类似,获取与当前JTA事务关联的会话。
不完全是。 SessionFactory.getCurrentSession()根据current session context获取会话。该策略的一个实现是JTA session context,它基本上将会话与JTA事务相关联。 JTA事务没有“拥有”Hibernate会话,因为JTA对Hibernate一无所知,并且说Hibernate内部使用JTA是不对的。它只是能够与JTA集成并让它管理交易。
这里我想了解行的作用// tx = session.beginTransaction();
它在您正在使用的任何事务机制中开始事务,该事务由正在使用的TransactionFactory管理。例如,使用JDBCTransactionFactory,它只是确保关闭auto-commit,以便在事务完成之前不会提交更改。
一旦我们提交特定事务,所有从同一会话创建的事务将被提交一次。
在正常情况下,会话仅与一个事务相关联。对Session.beginTransaction()的多次调用只需return the same underlying Transaction。
所以我们试图用// tx = session.beginTransaction()
来实现
就是这样:告诉管理您正在开始新交易的交易。这意味着在commit()或rollback()之前发生的所有事情都应该具有database transaction的普遍接受的语义。