我正在试验Hibernate
和log4j
。在下面的代码中,我特意注释了txn.commit()
,看看结果会是什么
在日志消息中,它仍然指示数据已插入到我的表中,但没有插入任何内容,日志消息是什么意思?
客户端类别:
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语句。因为您注释掉了提交,所以执行了该语句,但从未提交,因此在会话关闭时回滚。