hibernate 内部使用 jdbc 还是 JTA 还是可配置的?

问题描述 投票:0回答:1

我是hibernate新手,开始学习hibernate。我将要阅读的章节使用 hibernate 和 JDBC。我的第一个问题是hibernate内部使用jdbc还是JTA来执行持久化和获取操作?

但是我也可以在这里看到一些关于 JTA 的提及,例如

getCurrentSeessionSession()
方法获取与当前 JTA 事务关联的会话。问题:- 基本上我想了解JTA和jdbc在hibernate中的作用。

问题2:-我可以在休眠中的任何操作中看到下面的代码片段

try{ 
    session = factory.openSession();
    tx = session.beginTransaction();
    session.save(myClass);
    tx.commit();
}
finally{
    session.close();
}

在这里,我想了解线路的作用

tx = session.beginTransaction();
据了解,每个会话将使用一个连接。所以即使 如果我们从同一个会话启动多个事务,我们将使用相同的连接。一旦我们提交特定交易,所有交易 从同一会话创建的将被提交一次。那么我们想要通过
tx = session.beginTransaction();

实现什么目标
java hibernate jdbc persistence
1个回答
21
投票

hibernate内部使用jdbc还是JTA来进行persist和get操作?

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只关联一个事务。多次调用 Session.beginTransaction() 将简单地

返回相同的底层事务

那么我们试图通过 // tx=session.beginTransaction() 来实现什么

就是这样:告诉管理您交易的任何人您正在开始一项新交易。这意味着在 commit() 或 rollback() 之前发生的所有事情都应该具有

数据库事务
的普遍接受的语义。

© www.soinside.com 2019 - 2024. All rights reserved.