Hibernate:提交方法在日志中给出输出但不进入数据库?
Hibernate: commit method gives output in log but doesn't enter to database?
我正在试验 Hibernate
和 log4j
。在下面的代码中,我 故意 注释掉 txn.commit()
以查看结果。
在日志消息中,它仍然指示数据 已 插入到我的 table 中,但没有插入任何数据,日志消息是什么意思?
客户端Class:
public class HelloWorldClient {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction txn = session.getTransaction();
try {
txn.begin();
Address address = new Address("19 Sample st", "Sample state", "1234");
Person person = new Person("Person1", address);
session.save(person);
//txn.commit();
} catch(Exception e) {
if(txn != null) { txn.rollback(); }
e.printStackTrace();
} finally {
if(session != null) {
System.out.println("------------------------PROGRAM COMPLETED-------------------------");
session.close();
}
}
}
}
日志输出:
00:25:51,270 DEBUG SQL:109 - insert into Person (city, street, zipcode, name) values (?, ?, ?, ?)
00:25:51,305 TRACE BasicBinder:81 - binding parameter [1] as [VARCHAR] - [Sample state]
00:25:51,306 TRACE BasicBinder:81 - binding parameter [2] as [VARCHAR] - [19 Sample st]
00:25:51,306 TRACE BasicBinder:81 - binding parameter [3] as [VARCHAR] - [1234]
00:25:51,307 TRACE BasicBinder:81 - binding parameter [4] as [VARCHAR] - [Person1]
------------------------PROGRAM COMPLETED-------------------------
数据库事务基本上就像便签本。您可以在事务的上下文中发出某些类型的 SQL 语句,它们实际上是针对数据库执行的,但在您发出提交之前不会可见或永久存在。
在您的例子中,您启动了一个事务并调用了 session.save,它生成了您显示的 INSERT 语句。因为您注释掉了提交,所以该语句已执行但从未提交,因此在您的会话关闭时回滚。
我正在试验 Hibernate
和 log4j
。在下面的代码中,我 故意 注释掉 txn.commit()
以查看结果。
在日志消息中,它仍然指示数据 已 插入到我的 table 中,但没有插入任何数据,日志消息是什么意思?
客户端Class:
public class HelloWorldClient {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction txn = session.getTransaction();
try {
txn.begin();
Address address = new Address("19 Sample st", "Sample state", "1234");
Person person = new Person("Person1", address);
session.save(person);
//txn.commit();
} catch(Exception e) {
if(txn != null) { txn.rollback(); }
e.printStackTrace();
} finally {
if(session != null) {
System.out.println("------------------------PROGRAM COMPLETED-------------------------");
session.close();
}
}
}
}
日志输出:
00:25:51,270 DEBUG SQL:109 - insert into Person (city, street, zipcode, name) values (?, ?, ?, ?)
00:25:51,305 TRACE BasicBinder:81 - binding parameter [1] as [VARCHAR] - [Sample state]
00:25:51,306 TRACE BasicBinder:81 - binding parameter [2] as [VARCHAR] - [19 Sample st]
00:25:51,306 TRACE BasicBinder:81 - binding parameter [3] as [VARCHAR] - [1234]
00:25:51,307 TRACE BasicBinder:81 - binding parameter [4] as [VARCHAR] - [Person1]
------------------------PROGRAM COMPLETED-------------------------
数据库事务基本上就像便签本。您可以在事务的上下文中发出某些类型的 SQL 语句,它们实际上是针对数据库执行的,但在您发出提交之前不会可见或永久存在。
在您的例子中,您启动了一个事务并调用了 session.save,它生成了您显示的 INSERT 语句。因为您注释掉了提交,所以该语句已执行但从未提交,因此在您的会话关闭时回滚。