• NHibernate中session.update()及session.merge()的区别


    今天的工作中遇到一个奇怪的问题,如下:

    "a different object with the same identifier value was already associated with the session: 19519146"

    该异常的上下文如下:

    1:在net.tcp绑定的wcf远程调用时产生;

    2:通过UI调用方法不会产生该异常。

    分析该问题:

    由异常信息可以看出,该问题是由于在session.update对一组实体进行更新后,试图将新的实体associate到session(19519146)失败导致的,因为该session下已经有相同identifier的实体存在。

    同时,查阅session.update的说明:

    update(Object entity)
    Update the given persistent instance, associating it with the current Hibernate Session.

    由此可知,确实是由于update产生了这个问题(为什么会产生这个问题不太清楚,有人知道请不吝告知)。

    解决方案:

    查阅session提供的持久化方法:

    Object merge(Object entity)
    Copy the state of the given object onto the persistent object with the same identifier.

    在merge接口的定义中可看出,该接口是将给定的实体,拷贝到session下对应的已持久化实体(不知道该理解是否正确)。

    因此,通过调用merge()方法,可以避免这个异常。

    PS:

    通过查阅资料,session.evict()接口,可将持久化实体从session的缓存中清除,在该问题的上下文中,通过先调用该方法,清除原已持久化实体,再进行update(),也不会产生重复associating的异常。

    也可以通过清理session关联实体对象(session.clear())来解决问题。

  • 相关阅读:
    [NOIP2015] 子串 题解
    [NOIP2011] 聪明的质检员 题解
    二进制的一些概念
    [NOIP2012] 借教室 题解
    [POJ3764] The XOR Longest Path 题解
    关于本博客
    【SC-MY限定】让填写问卷星成为自动化!
    JZOJ5833 永恒
    九校联考-DL24凉心模拟Day2总结
    【简解】SP7556 Stock Charts
  • 原文地址:https://www.cnblogs.com/you-you-111/p/4564700.html
Copyright © 2020-2023  润新知