分享

hibernate getHibernateTempelete() get() load()

 一本正经地胡闹 2019-10-10

今天我在hibernate 进行 getHibernateTempelete().delete(entity) 数据的时候

抛出了一个异常,异常信息是空值引用了一个非空值,意思就是说在删除数据的时候ORM进行Mapping   映射时,将一个空值插入到了一个标识为不能为空的属性中. 

经过一段仔细的研究后发现hibernate 在进行delete,update 操作的时候,必须将传入的一个持久化Pojo对象,new 的对象是不行的,

需要在delete,update 时 加载持久化对象,所以我在加载的时候 ,选用了getHibernateTempelete.get(Entity.class,id)来获取这一持久对象.

后来有人说需要在update,delete操作时推荐使用load(Entity.class,id) 方法.加载持久化对象,这样可以在你缓存中读取数据.

    这里我搜了一点资料,是关于

getHibernateTempelete.get(Entity.class,id)和getHibernateTempelete.load(Entity.class,id) 的区别

转自 https://blog.csdn.net/iteye_18903/article/details/82135065


一、 get的用法

     1 get(final Class entityClass, final Serializable id, final LockMode lockMode)

       2 get(final String entityName, final Serializable id, final LockMode lockMode)

       一般lockMode默认为空,也就是说LockMode这个参数不写

       3 补充说明LockMode类:

       该实例代表关系型数据库表中一条记录的锁定方式,Hibernate的加锁模式---包括

       3.1  LockMode.NONE:无锁机制

       3.2  LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取 (注:不能在load的时候用,否则抛出异常)

       3.3  LockMode.READ:直接从数据库中读数据,绕过了Hibernate的Cache

       3.4  LockMode.UPGRADE:通过select * from ta for update方法,可以将查询结果中的记录进行update锁定,及不允许其他进行对这些记录进行修改,

       3.5  LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的for update nowait子句实现加锁     相对于upgrade 不想其他进行进入停顿状态,可以用nowait子句,直接返回操作异常信息,提示操作的记录处于锁定状态不能进行修改

二、load的用法

    同get

三、get和load的区别

主要的地方:

getHibernateTemplate.load() 存在延迟加载问题。

getHibernateTemplate.get()  不存在此问题,她是不采用lazy机制的。

1  当记录不存在时候,get方法返回null,load方法产生异常,即get()可以取空的数据集,但load()不行。  

       take a look at the Hibernate documentation (though I agree is not very explicit)--the HibernateTemplate is basically a wrapper around the native Hibernate API.

       get() will return null if an object is not found while load() will always return a   non-null object which is a proxy. If the underlying object does not exist, the proxy  will thrown ObjectNotFoundException.

       load() should be used when you are sure that the object exits while get() when you're not.

2  load方法可以返回实体的代理类,get方法则返回真是的实体类

3  load方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据,而get方法仅仅在内部缓存中

进行数据查找,如果没有发现数据則将越过二级缓存,直接调用SQL查询数据库。

4  也许别人把数据库中的数据修改了,load如果在缓存中找到了数据,则不会再访问数据库,而get则会

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在 使用过程中发现了问题,就抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

转自 https://blog.csdn.net/itough/article/details/20931671

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多