/**
* 对象的状态
*
* @author Administrator
*
*/
public class StateTest {
private static SessionFactory sessionFactory;
static {
Configuration configuration = new Configuration();
configuration.configure();
sessionFactory = configuration.buildSessionFactory();
}
@Test
public void testUpdatePerson() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = (Person) session.get(Person.class, 2L);
person.setPname("aaa");
session.update(person);//本来就是持久化状态 所以这行代码也没用
transaction.commit();
session.close();
}
/**
* 该程序发出了 Hibernate: select max(pid) from person
* 这条sql语句是在session.save(person);发出的
* Hibernate: insert into hibernate0909.person (pname, psex, pid) values (?, ?, ?)
* 是在transaction.commit();发出的 两条sql语句
*/
@Test
public void testSavePerson() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setPname("abc");
person.setPsex("asdf");
session.close();
session.save(person);
transaction.commit();
}
@Test
public void testSaveOrUpdate() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();// 临时状态
person.setPname("abc");// 临时状态
person.setPsex("asdf");// 临时状态
// session.save(person);//临时状态转化成持久化状态
person.setPname("aaaa");// 持久化状态
session.save(person);// 无用,因为已经是持久化状态
transaction.commit();// 同步到数据库中
session.close();// 托管状态
}
@Test
public void testUpdatePerson2() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = (Person) session.get(Person.class, 2L);
person.setPname("aaa");
/**
* 在执行session.update的时候, hibernate内部会为person对象去对照内存快照(副本),如果属性发生改变才要执行
* update语句,如果没有改变,则不发出update语句
*/
session.update(person);
transaction.commit();// 并没有发出update语句
session.close();
}
/**
* 如果执行session.save方法,hibernate内部会检查主键是否存在,如果存在,则不管
* 如果执行session.update方法,看属性是否发生变化,如果发生变化,则执行update语句,如果没有发生改变,则不执行
* 在hibernate内部,是通过标识符来判断一个对象在数据库中是否有值
*/
@Test
public void testUpdate3() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setPid(2L);
session.update(person);
transaction.commit();
session.close();
}
@Test
public void testSavePerson3() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();// 临时状态
person.setPname("abc");
person.setPsex("asdf");
session.save(person);// 持久化状态
transaction.commit();
session.close();// 当session关闭以后,事务环境不存在了
session = sessionFactory.openSession();// 打开了一个新的session,这个时候的session并没有保存person对象
Transaction transaction2 = session.beginTransaction();
session.update(person);// person中的id已经有值了
transaction2.commit();
session.close();
}
@Test
public void testaa() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person per = new Person();
//Person per = (Person)session.get(Person.class, 1L);
per.setPid(1L);
per.setPsex("男");
per.setPname("Steven");
session.update(per);
session.getTransaction().commit();
// 数据库中id、name、sex全都一样,为什么还执行update语句?
session.close();
}
}
public class StateExam {
private static SessionFactory sessionFactory;
static {
Configuration configuration = new Configuration();
configuration.configure();
sessionFactory = configuration.buildSessionFactory();
}
/**
* 利用session.createQuery("from Person").list方法把person表的所有的数据全部提取出来
然后遍历list,把person中的属性做一些改变,最后提交事务,关闭session.
*/
@Test
public void testEx01(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
List<Person> personList = session.createQuery("from Person").list();
for(Person person:personList){
person.setPname("干露露");//person已经是持久化对象的状态
}
transaction.commit();
session.close();
}
/**
* 新创建一个person对象,执行save方法,再关闭session,
再重新打开一个session,让person对象的属性值发生改变,把改变后的结果同步到数据库中
*/
@Test
public void testEx02(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setPname("干露露的妈");
person.setPsex("腰");
session.save(person);
transaction.commit();
session.close();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
person.setPsex("老妖");
session.update(person);
transaction.commit();
session.close();
}
@Test
public void test1(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
List<Person> persons=session.createQuery("from Person").list();
for (Person person : persons) {
person.setPname("你妹");
}
transaction.commit();
session.close();
}
}