load(Class cls , Serializable pk)使用延迟加载来查询记录,不会立即产生sql语句。当实际使用属性的时候才会去查询。如果查询一个不存在的主键,在使用的时候会抛出org.hibernate.ObjectNotFoundException,不使用的话不会抛出这个异常。
get(Class cls , Serializable pk)不使用延迟加载查询记录,立即产生sql语句,查询不存在的主键时,不会产生任何异常,返回值为null
save(Object o)会保存一个对象,并返回该对象的主键。同时为这个对象设置id属性为添加到数据库中的id
persist(Object o)会保存一个对象,没有返回值、但是会为刚刚保存的对象设置主键为保存到数据库中的主键
如果在事务开启的情况下,对bean所做的任何修改都会反映到数据库,例如
Province p = session.load(Province.class,1);
session.beginTransaction();
p.setName("改了值");
session.getTransaction().commit();
则数据库中id为1的省份的最终的名称为改了值
但是如果没有开启事务的话,则对bean的修改不会反映到数据库。
一旦调用了session.flush或者是session.getTransaction().commit(),都会反映到数据库,前提是必须开启了事务。否则不会反映到数据库。
merge(Object obj)方法,会将一个实例化对象保存到数据库,并且返回为此对象赋值id后的对象。但是这个方法不会将对象的状态转换为持久化状态,对象的状态依然是瞬时状态 ,返回的对象会是持久化对象,所以,如果还想让该对象和数据库保持持久化状态的话,应将持久化对象覆盖源对象。
update(Object obj) 更新一个对象,如果这个对象不是持久化对象,也就是还没有保存到数据库,则更新此对象,会抛出org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 , 意思就是该对象还没有保存。
更新的时候注意一点就是不能改变主键
否则会报告异常
org.hibernate.HibernateException: identifier of an instance of com.bean.Province was altered from 1 to 2
saveOrUpdate(Object obj)命令是保存或更新对象,具体调用保存还是更新看的是根据主键是否为空,如果为空,则调用的是save如果是非空,则调用的是update.同样update时候不能改变主键。