hibernate基本方法

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时候不能改变主键。

相关推荐