Как остановить сеанс для сохранения сохраненных объектов во время выполнения запроса? - PullRequest
0 голосов
/ 02 сентября 2010

У меня проблема с выполнением сеанса и запроса, см. Код ниже.

class A implements Lifecycle{
    public boolean onUpdate(Session session){
        Query test=session.createQuery("select * from Unknown");
        List list=test.list();
        B b=new B();
        session.save(b);
    }
}
class B{
    C c;
    public B(){
        c=new C();
        c.a=new A();
    }
}
class C implements Lifecycle{
    A a;
    public boolean onSave(Session session){
        a.onUpdate(session);
    }
}

Я изменил объект и вызывал onUpdate method.but исключение всякий раз, когда я вызываю метод a.onUpdate ();

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.test.C

Я знаю, что вышло исключение из-за выполнения запроса в методе onUpdate. Пожалуйста, предложите мне, есть ли способ остановить сохранение несохраненных объектов во время выполнения запросов. или любое другое предложение по вышеуказанной проблеме очень полезно.

1 Ответ

1 голос
/ 02 сентября 2010

пожалуйста, предложите мне, есть ли способ остановить сохранение несохраненных объектов во время выполнения запросов

Чтобы строго ответить на этот вопрос, по умолчанию Hibernate действительно сбрасывает сеанс при выполнении запроса так,что вы не получите устаревших результатов.Вы можете изменить это поведение, используя пользовательский FlushMode (COMMIT или НИКОГДА).Из документации:

10.10.Сброс сеанса

Иногда сеанс выполняет SQL-операторы, необходимые для синхронизации состояния соединения JDBC с состоянием объектов, хранящихся в памяти.Этот процесс, называемый сбросом, происходит по умолчанию в следующих точках:

  • перед выполнением некоторых запросов
  • с org.hibernate.Transaction.commit()
  • с Session.flush()

Операторы SQL выдаются в следующем порядке:

  • все вставки сущностей в том же порядке, соответствующие объекты были сохранены с использованием Session.save()
  • всех обновлений сущностей
  • все удаления коллекции
  • все удаления, обновления и вставки элементов коллекции
  • все вставки коллекции
  • все удаления сущностей в том же порядке, соответствующие объекты были удаленыиспользование Session.delete()

Исключением является то, что объекты, использующие генерацию собственных идентификаторов, вставляются при их сохранении.

За исключением случаев, когда вы явно flush(), нет никаких гарантий относительно того, когдаСеанс выполняет вызовы JDBC, только порядок, в котором они выполняются.Однако Hibernate гарантирует, что Query.list(..) никогда не вернет устаревшие или неверные данные.

Можно изменить поведение по умолчанию, чтобы сброс происходил реже. Класс FlushModeопределяет три различных режима: сбрасывать только во время фиксации, когда используется Hibernate Transaction API, сбрасывать автоматически, используя объясненную процедуру, или никогда не сбрасывать, если явно не вызывается flush().Последний режим полезен для длительных единиц работы, когда сеанс остается открытым и отключенным в течение длительного времени (см. Раздел 11.3.2, «Расширенный сеанс и автоматическое управление версиями» ).

sess = sf.openSession();
Transaction tx = sess.beginTransaction();
sess.setFlushMode(FlushMode.COMMIT); // allow queries to return stale state

Cat izi = (Cat) sess.load(Cat.class, id);
izi.setName(iznizi);

// might return stale data
sess.find("from Cat as cat left outer join cat.kittens kitten");

// change to izi is not flushed!
...
tx.commit(); // flush occurs
sess.close();

Во время сброса может возникнуть исключение (например, если операция DML нарушает ограничение).Поскольку обработка исключений требует некоторого понимания транзакционного поведения Hibernate, мы обсудим это в Глава 11, Транзакции и параллелизм .

Но, честно говоря, я не уверен, что понимаю, что вы 'мы пытаемся это сделать (и, возможно, это всего лишь пример, но ваш HQL-запрос неверен).

Ссылки

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