powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
20 сообщений из 20, страница 1 из 1
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38035570
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Seam-gen cгенерировал проект.
Нахожусь в окошечке редактирования данных: mYentitjaEdit.xhtml
там опрашивается переменная #{mYentitjaHome.managed} - если она true (т.е. seam хочет управлять объектом!) то он при клике на любой мой <h:commandButton посылает через Hibernet:

update
myShema.mYentitjaTbl
set
NAME=?,
...

но ДО этого происходит вызов из написанной мною функции (которая вызывается по той же самой <h:commandButton!) некоей моей DB-StoredProc, которая апдейтит табличку myShema.mYentitjaTbl "кошерно". Т.е. вышепоказанный автоматизм от хайбернета (update myShema.mYentitjaTbl) не нужен и даже очень вреден!
Вопрос: как (каким трюком) его избежать, оставляя всё остальное (select, insert) таки в управляемом mnaged режиме??
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38035571
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* mnaged режиме = managed режиме
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38035596
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWM,

Если память не изменяет то нужен

Код: java
1.
@Begin(flushMode=MANUAL)
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38035916
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTk,

Т.е. Это перед моей функцией апдейта ставить, да? Спасибо попробую!
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38035960
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTkViktorWM,

Если память не изменяет то нужен

Код: java
1.
@Begin(flushMode=MANUAL)



не, думаю это не то.... Т.к. у меня для этой странички в *Edit.Page.xml и так уже стоит

<begin-conversation join="true" flush-mode="MANUAL"/>

а если ставлю в ява-классе перед вызовом функции вашу @Begin(flushMode=MANUAL) то оно ругается, что нигде не находит тип MANUAL.
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38035969
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWM, Тогда видимо я не могу понять что ты хочешь сделать. Опиши подробнее. Желательно с куском кода.
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38035974
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWM,

Вопрос в догонку, ты используешь 2.3 версию или выше-ниже?
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38037204
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTkViktorWM,

Вопрос в догонку, ты используешь 2.3 версию или выше-ниже?

версия старенькая у меня - 2.2.

Ответ на мой вопрос оказался элементарным:

Код: java
1.
  EntityManager.clear() 



вот и всё что мне было надо! Но всё же спасибо за участие!
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38037322
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWMGregTkViktorWM,

Вопрос в догонку, ты используешь 2.3 версию или выше-ниже?

версия старенькая у меня - 2.2.


Мои соболезнования :)
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38042389
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EntityManager.clear()

увы, я уже сомневаюсь, что это хорошее решение! Т.к. в случае ошибки (сообщенной из хранимой процедуры!) нужно оставаться в контексте, чтоб дать юзеру возможность подправить введенные данные!!! А при вызове EntityManager.clear() контекст теряется, вестимо... Вообщем, как правильно отключить (одноразово) в этом месте ненавистный hibetnet !? :-)
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38042395
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWM,

Ну так можно подробнее, что не работает, пример кода где мешает hibernate? Из твоего описание не понятно что там за компонент и как он управляется.
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38042564
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTk,

на .page.xml cтраничке есть "правило":

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
....
  <begin-conversation join="true" flush-mode="MANUAL"/>

   <action execute="#{myObjHome.wire}"/>

   <param name="myobjFrom"/>
   <param name="myobjId" value="#{myObjHome.usrsId}"/>
...

 <navigation from-action="#{myObjHome.update}">
     <rule if-outcome="updated">
       <end-conversation/>
       <redirect view-id="/prote/MyObjList.xhtml"/>
     </rule>
      
  </navigation>
...




в ява классе вызов моей StoredProc:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
...

 public String update() {
...
...
 try {                
	      conn = GetDbConn(); //cами берем коннекшен, а не через EM!  
              cs = conn.prepareCall("{ ? = call myStorProc( ?,?,?,?,?, ?,?,?,?,?,?, ?,?,?,? ) }");
	      this.getEntityManager().setFlushMode( FlushModeType.COMMIT ); 
	      this.getEntityManager().joinTransaction();  
  	      
	      cs.registerOutParameter(1, Types.VARCHAR);
 	      
	      cs.setLong( 2, lId );
	      cs.setString( 3, lmyObj.getLogin() );
           lRes = "updated";
 ....
catch
...
     lRes = "error";

}

 this.getEntityManager().clear();
 return lRes;
}
...



так вот нужно чтобы контекст объекта сохранялся (для возможности исправления введеных юзверем данных!!!) даже когда StorProc обламывается! ( т.е. когда возвращается lRes = "error" )
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38042594
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWM,

уф... Вообщем не понятно что у тебя происходит.

1. Создаём Conversation context
2. В нём делаем какое-то действие в зависимости от результата этого действия закрываем контекст или держим дальше.

В каком месте мешает hibernate? Что показывает debug.seam у нас там закрывается Conversation context или нет?
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38042958
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTk,

автор2. В нём делаем какое-то действие в зависимости от результата этого действия закрываем контекст или держим дальше.
ну дык я бы так и хотел - если б это только так получалось!!! ))

вот кнопка делающая update:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
<h:commandButton id="myObjEdt"
                          value="Save (Edit)"
                         action="#{myObjHome.update}"
                     propagation="end"                         
                         view="/prote/MyObjList.xhtml"
                         rendered="#{myObjHome.managed}"
                        />



важнейшим тут является .managed! То есть в состоянии managed функции моего класса, который наследует "extends EntityHome", (я конечно в его исходниках не рылся) вызывают SQL "update mytable set ... where " через hibernet! Что мне мешает, ибо я делаю эту задачу ТОЛЬКО через свой StoredProc! Поэтому я вынужден вызывать в конце моей процедурки this.getEntityManager().clear(); которая похоже сбрасывает флаг/cостояние managed (убивая контекст, как я понял... Но не саму Conversation - debug страничка показывает что она то цела!) ну и кнопка update понятное дело исчезает с формы (managed=false)!

Если ты делал проект сгенеренный seam-gen-ом на основе таблиц БД, ты должен меня понять.
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38042968
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин! уже сам во всём разобрался! Они похоже чё то там намудрили с этим флагом ".managed" просто ))) Я его в итоге тупо заменил на свою функцию, в которой тупо опрашиваю наличие Id (prim.-key!) обрабатываемого объекта (и >0!). И всё ))) Оказалось, что контекст они вовсе таки не убивают! )))

Вопрос снят, спасибо!
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38042996
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWM,

А перекрыть метод update() не помогло? По идеи managed определяет есть у тебя инстанс в базе или нет.

а managed определяется там так:
Код: java
1.
2.
3.
4.
5.
6.
 @Transactional
   public boolean isManaged()
   {
      return getInstance()!=null && 
            getEntityManager().contains( getInstance() );
   }
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38043228
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTkА перекрыть метод update() не помогло?

может я конечно ещё не силен в яве, но я так понимал, что если метод в потомке назван так же как и в родителе, то он какбэ уже перекрыт! Или нужен обязательно в seam нотация @Override ?

Но в любом случае без "this.getEntityManager().clear()" идет (мешающий!) update от hibernate!
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38043259
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWM,

Хм, ты хочешь сказать что ты перекрывал update() и всё равно происходил вызов update таблицы? А ты уверен что при этом вызывался твой метод, а то какая-то магия получается.
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38043290
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTk,


в том то и дело что не уверен! То что мой метод update() вызывается - 100%! Но вот откуда берется вызов помимо него(c хибернетом который)?! ведь я не писал в нем ничего похожего на "super.update()"!!! (видимо эта магия кроется унутрях состояния "managed")
...
Рейтинг: 0 / 0
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
    #38043332
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWM,

Собственно нужно в дебагере смотреть что происходит, само по себе там ничего не должно вызываться. Внутри самого EntityHome и Home ничего нет, единственное что там происходит это создание твоего наследника в Conversation контексте.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]