是否有可能分离Hibernate实体,以便更改对象不会自动保存到数据库?
我有Hibernate实体,我必须转换为JSON,我必须在实体中翻译一些值,但是当我翻译值时,这些值立即保存到数据库,但我不想将这些更改保存到数据库。 有没有解决这个问题的方法?
你可以通过调用Session.evict()
来分离一个实体。
其他选项是在转换值之前创build实体的防御副本,或者使用DTO而不是该代码中的实体。 我认为这些选项更优雅,因为它们不转换到JSON和持久层。
我也转换hibernate实体为JSON。
当你closures会话时,你不能懒惰加载对象的坏事。 为此,您可以使用
hSession.setDefaultReadOnly(true);
并在完成JSON后closures会话。
您还可以通过使用StatelessSession
来避免您的实体附加到Hibernate Session:
StatelessSession session = sessionFactory.openStatelessSession();
代替
Session session = sessionFactory.getCurrentSession();
请注意,与常规的Hibernate会话不同,您必须小心closuresStatelessSession
:
session.close(); // do this after you are done with the session
与常规Session相比,另一个区别是StatelessSession
无法获取集合。 我看到它是数据抓取SQLQuery
的主要目的。
你可以在这里阅读更多有关不同会话types的信息:
closures会话。 这将为您分离您的实体,并且不会进行修改。 如果这是不可能的,看看禁用autoFlush …但这是一个完整的其他jar蠕虫。 最简单的就是closures会议并完成它!
public static <E> E deepClone(E e) { ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo; try { oo = new ObjectOutputStream(bo); oo.writeObject(e); } catch (IOException ex) { ex.printStackTrace(); } ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi; try { oi = new ObjectInputStream(bi); return (E) (oi.readObject()); } catch (IOException ex) { ex.printStackTrace(); return null; } catch (ClassNotFoundException ex) { ex.printStackTrace(); return null; } }
第一:深入克隆会议pojo
第二:改变字段
然后:做任何你想做的事情