Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте) / 20 сообщений из 20, страница 1 из 1
13.11.2012, 03:38:29
    #38035570
ViktorWM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
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
13.11.2012, 03:39:40
    #38035571
ViktorWM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
* mnaged режиме = managed режиме
...
Рейтинг: 0 / 0
13.11.2012, 06:39:04
    #38035596
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
ViktorWM,

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

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

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

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

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



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

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

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

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

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

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

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

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



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

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

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


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

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

Ну так можно подробнее, что не работает, пример кода где мешает hibernate? Из твоего описание не понятно что там за компонент и как он управляется.
...
Рейтинг: 0 / 0
17.11.2012, 15:31:12
    #38042564
ViktorWM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
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
17.11.2012, 17:02:27
    #38042594
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
ViktorWM,

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

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

В каком месте мешает hibernate? Что показывает debug.seam у нас там закрывается Conversation context или нет?
...
Рейтинг: 0 / 0
18.11.2012, 02:49:07
    #38042958
ViktorWM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
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
18.11.2012, 03:50:53
    #38042968
ViktorWM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по Jboss SEAM (как подавить хайбернет в конкретном месте)
блин! уже сам во всём разобрался! Они похоже чё то там намудрили с этим флагом ".managed" просто ))) Я его в итоге тупо заменил на свою функцию, в которой тупо опрашиваю наличие Id (prim.-key!) обрабатываемого объекта (и >0!). И всё ))) Оказалось, что контекст они вовсе таки не убивают! )))

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

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

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

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

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

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


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

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


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