Is it possible to detach Hibernate entity, so that changes to object are not automatically saved to database?

前端 未结 5 1217
野性不改
野性不改 2020-11-30 00:12

I have Hibernate entity that I have to convert to JSON, and I have to translate some values in entity, but when I translate values, these values are instantly saved to datab

相关标签:
5条回答
  • 2020-11-30 00:49

    I am also converting hibernate entities to JSON.

    The bad thing when you close the session you cannot lazy load objects. For this reason you can use

    hSession.setDefaultReadOnly(true);
    

    and close the session after when you're done with the JSON.

    0 讨论(0)
  • 2020-11-30 00:49
    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;
        }
    }
    

    first: deepClone the session pojo
    second: alter fields
    then: do whatever you want to do

    0 讨论(0)
  • 2020-11-30 00:50

    You can detach an entity by calling Session.evict().

    Other options are create a defensive copy of your entity before translation of values, or use a DTO instead of the entity in that code. I think these options are more elegant since they don't couple conversion to JSON and persistence layer.

    0 讨论(0)
  • 2020-11-30 01:03

    You can also avoid that your entities are attached to the Hibernate Session by using a StatelessSession:

    StatelessSession session = sessionFactory.openStatelessSession();
    

    instead of

    Session session = sessionFactory.getCurrentSession();
    

    Note that you must take care yourself of closing the StatelessSession, unlike the regular Hibernate Session:

    session.close(); // do this after you are done with the session
    

    Another difference compared to the regular Session is that a StatelessSession can not fetch collections. I see it's main purpose for data-fetching-only SQLQuery stuff.

    You can read more about the different session types here:

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

    0 讨论(0)
  • 2020-11-30 01:03

    Close the Session. That will detach your entity for you, and no modifications will be flushed. If that's not possible, look into disabling autoFlush...but that's a whole other can of worms. The easiest is to close the Session and be done with it!

    0 讨论(0)
提交回复
热议问题