Состояние спящего объекта - PullRequest
4 голосов
/ 20 марта 2012

Я тестирую Hibernate, вот ситуация и код:

public static void main(String[] args) {
    SessionFactory factory = HibernateUtil.getSessionFactory();
    Tag tag;

    // (case A)    
    Session session = factory.getCurrentSession();
    Transaction tx = session.beginTransaction();
    tag = (Tag) session.get(Tag.class, 1);
    tag.setName("A");
    tx.commit();
    // session is automatically closed since it is current session and I am committing the transaction
    // session.close();     

    //here the tag object should be detached

    //(case B)
    session = factory.getCurrentSession();
    tx = session.beginTransaction();
    // tag = (Tag) session.merge(tag); // I am not merging
    tag.setName("B"); //changing
    // session.update(tag); 
    tx.commit();
    // session.close();
}

Не обновляется для case B (tag.setName("B") не работает).

Тогда я раскомментирую session.update(tag); в case B, теперь это работает. Должно выдавать ошибку из-за того, что объект не объединен с транзакцией case B.

Мы можем сказать, что используем factory.getCurrentSession(), поэтому нет необходимости объединять его, но если заменить его на factory.openSession(); и закрывать сеанс после каждого случая, он все еще работает (с вызовом update в case B). Так в каком смысле мы называем объект обособленным?

1 Ответ

3 голосов
/ 29 июня 2012

случай A: сеанс не закрыт, а объект tag находится в постоянном состоянии, и он (объект тега) связан с текущим сеансом.

случай B: здесь сеанс может быть таким же, как и в первой транзакции,Вы меняете значение объекта tag, который находится в постоянном состоянии.Persistent state represents existence of object in permanent storage. There will be connection between the object in memory and in database through the identifier. Any change in either of these two will be reflected in other (when transaction is committed). Persistent state is dependent on session object. First, session has to be open (unclosed) [это верно в вашем случае] , and second, the object has to be connected to the session. If either of these two is not true, then the object moves into either transient state or detached stage.

Объект находится в отдельном состоянии в следующем случае: Detached state arises when a persistent state object is not connected to a session object. No connection may be because the session itself is closed or the object is moved out of session.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...