脱管和瞬态-名异实同

首先声明,本人菜鸟,望大家探讨,共同进步。
先看列子:
Preson 主键id,而且在数据库自动生成策略。其他字段均可为空,本次讨论中使用firstname字段修改。
xml配置均使用hibernate默认配置,参数均无修改。
1.正常由transient->persistent
public void test1(){
		Person p = new Person();//transient
		p.setFirstname("harrison");
		Session session = SessionFactory.getSession();
		session.beginTransaction();
		session.save(p);//Persistent
		session.getTransaction().commit();
		session.close();
	}

console
Hibernate: insert into Person (age, firstname, lastname) values (?, ?, ?)
数据库保存ok
2.正常由persistent->detached->persistent,修改刚插入的数据
public void test2(){
		Session session = SessionFactory.getSession();
		session.beginTransaction();
		Person p = (Person)session.get(Person.class, 1L);//Persistent
		session.getTransaction().commit();
		session.close();
		p.setFirstname("second");//Detached
		session = SessionFactory.getSession();
		session.beginTransaction();
		session.update(p);//Persistent again
		session.getTransaction().commit();
		session.close();
	}

console:
Hibernate: select person0_.PERSON_ID as PERSON1_2_0_, person0_.age as age2_0_, person0_.firstname as firstname2_0_, person0_.lastname as lastname2_0_ from Person person0_ where person0_.PERSON_ID=?
Hibernate: update Person set age=?, firstname=?, lastname=? where PERSON_ID=?
数据库更新ok
3.把transient当作detached用
public void test3(){
		Person p = new Person();//transient
		p.setId(1L);
		p.setFirstname("third");
		Session session = SessionFactory.getSession();
		session.beginTransaction();
		session.update(p);//Persistent
		session.getTransaction().commit();
		session.close();
	}

console:
Hibernate: update Person set age=?, firstname=?, lastname=? where PERSON_ID=?
数据库更新成功

相信大家也看明白了,脱管状态的object,再次重新连接session和transient状态的对象没有区别,他们都是游离的状态,和session没有关系了,他们的区别是在业务的逻辑上,与存在的道理是没有区别的。
如果由兴趣的朋友可以继续研究下,当new 一个person是在数据库主键相同的对象,hibernate虽然执行了insert语句,但是并没有成功,也没有异常,同样把datached状态的对象修改以后,如果不用update而使用insert方法,也就是把这个object当作transient来处理的时候,hiberntae也同样执行了insert语句,但是数据库也没有发生变化,也没有异常。如此可见,transient和detanched的存在方式是相同的。

你可能感兴趣的:(Hibernate,xml)