save(),update(),saveOrUpdate()
1.save()导致的最终结果是执行insert语句,先看下面的代码:
1. Session session2=HibernateUtil.getSession(); Customer c2=(Customer)session2.load(Customer.class, new Long(5));
2. HibernateUtil.closeSession(session2);
3. c2.setName("ghsea5");
4. session.save(c2);
5. tx.commit();
这里查询出的是ID为5的一个对象,执行session.save(c2)后数据库里会插入一条ID为6的数据,如果只是想修改这个ID为5的对象的name属性,而不是新插入一条数据,可以执行session.flush(),使session与数据库同步。不要错误地用save()去同步session缓存和数据库。它只是用来保存一个记录的,是用来“Persist the given transient instance, first assigning a generated identifier”。
update和saveOrUpdate是用来对跨Session(即脱 管的)的PO进行状态管理的。
2.“update的作用就在于此,它只会被用于当一个PO对象跨Session进行状态同步的时候才需要写。而一个PO对象当它不需要跨Session进行状态管理的时候,是不需要写update的。”
1. tx=session.beginTransaction();
2. Session session2=HibernateUtil.getSession();
3. Customer c2=(Customer)session2.load(Customer.class, new Long(5));
4. HibernateUtil.closeSession(session2);
5. c2.setName("ghsea5");
6. session.update(c2);
7. tx.commit();
执行第4行后,c2变成脱管对象,第6行,用session对以c2进行更新,这里c2是跨Session的。
3.saveOrUpdate和update的区别就在于在跨Session的PO状态管理中,Hibernate对PO采取何种策略。
1. public void addMate(Grade cat, Student mate) {
2. Session session = ...;
3. Transacton tx = ...;
4. session.saveOrUpdate(cat);
5. cat.addMate(mate);
6. tx.commit();
7. session.close();
8. };
上面这些代码用到saveOrUpdate是合理的,如果用save()不一定合适,试想一下,如果只是想给一个存在的Grade(班级)添加一个Srudent,用save()导致的结果将是向数据库中插入一条新的记录,即一个新的班级,而saveOrUpdate的策略是,如果该对象的ID已经存在,则执行update(),如果该对象的ID不存在,则用save()策略。
Hibernate此时究竟采取更新cat对象,还是save cat对象,取决于unsave-value的设定。如下面这样设定unsave-value:
1.save()导致的最终结果是执行insert语句,先看下面的代码:
1. Session session2=HibernateUtil.getSession(); Customer c2=(Customer)session2.load(Customer.class, new Long(5));
2. HibernateUtil.closeSession(session2);
3. c2.setName("ghsea5");
4. session.save(c2);
5. tx.commit();
这里查询出的是ID为5的一个对象,执行session.save(c2)后数据库里会插入一条ID为6的数据,如果只是想修改这个ID为5的对象的name属性,而不是新插入一条数据,可以执行session.flush(),使session与数据库同步。不要错误地用save()去同步session缓存和数据库。它只是用来保存一个记录的,是用来“Persist the given transient instance, first assigning a generated identifier”。
update和saveOrUpdate是用来对跨Session(即脱 管的)的PO进行状态管理的。
2.“update的作用就在于此,它只会被用于当一个PO对象跨Session进行状态同步的时候才需要写。而一个PO对象当它不需要跨Session进行状态管理的时候,是不需要写update的。”
1. tx=session.beginTransaction();
2. Session session2=HibernateUtil.getSession();
3. Customer c2=(Customer)session2.load(Customer.class, new Long(5));
4. HibernateUtil.closeSession(session2);
5. c2.setName("ghsea5");
6. session.update(c2);
7. tx.commit();
执行第4行后,c2变成脱管对象,第6行,用session对以c2进行更新,这里c2是跨Session的。
3.saveOrUpdate和update的区别就在于在跨Session的PO状态管理中,Hibernate对PO采取何种策略。
1. public void addMate(Grade cat, Student mate) {
2. Session session = ...;
3. Transacton tx = ...;
4. session.saveOrUpdate(cat);
5. cat.addMate(mate);
6. tx.commit();
7. session.close();
8. };
上面这些代码用到saveOrUpdate是合理的,如果用save()不一定合适,试想一下,如果只是想给一个存在的Grade(班级)添加一个Srudent,用save()导致的结果将是向数据库中插入一条新的记录,即一个新的班级,而saveOrUpdate的策略是,如果该对象的ID已经存在,则执行update(),如果该对象的ID不存在,则用save()策略。
Hibernate此时究竟采取更新cat对象,还是save cat对象,取决于unsave-value的设定。如下面这样设定unsave-value: