Hibernate 脏数据(session.isDirty())
持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是执行commit()之后,才在数据库中真正运行SQL进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏(dirty)对象。
java代码片断如下:
public void sessionDirtyTest(){
User user=new User();
user.setUserid(new BigDecimal(1));
user.setLoginName("crabdave");
user.setUsername("David");
user.setPassword("David");
user.setSex("male");
user.setFixPhone("123456");
user.setMobilePhone("1234567890");
user.setDeleteFlag("1");
user.setStatus("1");
user.setAge("27");
user.setContract("1");
user.setDepartment("dept");
ApplicationContext ac = new FileSystemXmlApplicationContext("D:/PracticeWorkSpace/SSHPractice/src/main/resources/struts_1_spring.xml");
SessionFactory sessionFactory = ((HibernateTemplate)ac.getBean("hibernateTemplate")).getSessionFactory();
Session session=sessionFactory.openSession();
System.out.println("1.session.isDirty():"+session.isDirty());
Transaction tx=session.beginTransaction();
System.out.println("2.session.isDirty():"+session.isDirty());
tx.begin();
System.out.println("3.session.isDirty():"+session.isDirty());
session.update(user);
System.out.println("4.session.isDirty():"+session.isDirty());
tx.commit();
System.out.println("5.session.isDirty():"+session.isDirty());
session.close();
System.out.println("6.session.isDirty():"+session.isDirty());
}
运行结果如下:
1.session.isDirty():false
2.session.isDirty():false
3.session.isDirty():false
4.session.isDirty():true
Hibernate: update user set loginName=?, username=?, password=?, sex=?, fixPhone=?, mobilePhone=?, deleteFlag=?, status=?, age=?, contract=?, department=? where userid=?
5.session.isDirty():false
Exception in thread "main" org.hibernate.SessionException: Session is closed!
分享到:
相关推荐
`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...
SessionFactory由Configuration实例创建,配置文件通常为`hibernate.cfg.xml`,其中包含了数据库连接信息、实体类映射等设置。 接下来,我们可以通过SessionFactory获取Session实例。然后,可以使用Session的`save...
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect ``` 这种方式不仅使得配置更加灵活,也便于后期维护和调整。 ##### 3. 利用现有的容器管理的数据源 在一些企业级应用中,可能会...
- 配置文件`hibernate.cfg.xml`用于设置数据库连接和其他配置,需确保正确配置。 - `SessionFactory`是线程不安全的,通常在应用启动时创建一次,然后在整个应用生命周期中复用。 - 记得在完成数据库操作后关闭`...
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb <property name="hibernate.connection.username">root <property name="hibernate.connection.password">password <!-- ...其他...
hibernate.cfg.xml hibernate框架的配置文件
使用Hibernate3时,开发者首先需要配置Hibernate的XML配置文件(通常是hibernate.cfg.xml),其中包含了数据库连接信息、方言设置、缓存策略等。然后,通过SessionFactory创建Session对象,Session是与数据库交互的...
- `Configuration`类:负责读取和解析hibernate.cfg.xml配置文件,生成SessionFactory实例。 - `SessionFactoryImpl`:实际的SessionFactory实现,包含Session的创建逻辑和缓存管理。 - `SessionImpl`:Session的...
然而,在某些特定场景下,我们可能并不需要频繁地打开和关闭Session,这时“Hibernate-nosession”就显得尤为重要。本文将深入探讨Hibernate-nosession的概念、应用场景以及如何在实际代码中实现。 首先,理解什么...
使用`SessionFactory.getCurrentSession()`,Hibernate会尝试绑定Session到当前的JTA(Java Transaction API)事务。这意味着如果当前存在一个活动的事务,那么返回的Session将参与这个事务。这种方法的优点在于它...
这种映射主要由Hibernate的配置文件(hibernate.cfg.xml)和实体类(Entity Class)来实现。 在MySQL查询方面,Hibernate提供了多种查询方式,包括HQL(Hibernate Query Language)和Criteria API。HQL是Hibernate...
Hibernate 2是Hibernate系列的早期版本,它提供了一种模型化关系数据为面向对象的方式,使得开发者可以使用Java对象来处理数据库操作,而无需过多关注SQL语法。这降低了数据库操作的复杂性,提高了开发效率。 2. *...
1. Session:这是Hibernate的核心接口,代表了与数据库的一次会话。Session负责对象的持久化,提供了增删查改(CRUD)操作,并支持事务管理。 2. Transaction:在Hibernate中,Transaction接口处理事务边界,确保...
hibernate中session对象的状态详解
3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. ...
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory <property name="jta.UserTransaction">java:comp/UserTransaction ``` 如果你的环境不支持JTA或者更倾向...
二级缓存则是在多个`Session`间共享的,可以提高数据读取效率,但需谨慎使用以防止数据一致性问题。 8. **持久化类和映射文件**:持久化类是与数据库表对应的Java类,通常包含一些特定的注解或XML映射文件...
Hibernate官方推荐使用`version`方式,因为它在对象离开Session后还能有效防止并发问题。 在实际应用中,悲观锁适用于高并发但数据冲突可能性大的场景,它可以有效避免并发问题,但可能降低并发性能。而乐观锁适用...
3. **缓存配置**:可以选择使用一级缓存(SessionFactory级别的)和二级缓存(例如,使用Ehcache),通过`<property name="hibernate.cache.region.factory_class">`指定缓存提供者。 4. **日志配置**:通过`...