是否有可能分离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的信息:

http://www.interviewadda.com/difference-between-getcurrentsession-opensession-and-openstatelesssession/

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
第二:改变字段
然后:做任何你想做的事情