Как остановить сеанс для сохранения несохраненных объектов во время выполнения запроса? - PullRequest
2 голосов
/ 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: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом: com.test.C

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

1 Ответ

2 голосов
/ 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, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...