Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JBoss и Postgresql


Автор: Rusico 13.7.2007, 14:09
Ещё раз здрасти.
Вчера всех замучил с "JBoss вне localhost"/
Спасибо разобрался.

Сегодня мучаю JBoss+Postgresql. 
Вроде даже получилось их подружить, но когда дело доходит до работы клиента возникает ошибка:

   java.lang.IllegalStateException: Failed to find method for hash:6844222132332216879 available={8594593460157411074=public abstract javax.ejb.EJBObject.............


Что это?!?!?! она меня пугает - я не понимаю что мне хочет сказать JBoss.

И ещё: как организовать работу с БД, чтоб работал autoincrement?
Т.е. я не хочу создавать бины через метод create(id), хочу чтоб Jboss брал id из поля SERIAL в таблице.

Подскажите плз.

Автор: ekr 13.7.2007, 15:40
Цитата(Rusico @  13.7.2007,  14:09 Найти цитируемый пост)
 java.lang.IllegalStateException: Failed to find method for hash:6844222132332216879 available={8594593460157411074=public abstract javax.ejb.EJBObject.

глянь http://www.jboss.com/?module=bb&op=viewtopic&p=3909309, может та жа самая трабла.


Цитата(Rusico @  13.7.2007,  14:09 Найти цитируемый пост)
как организовать работу с БД, чтоб работал autoincrement?
Т.е. я не хочу создавать бины через метод create(id), хочу чтоб Jboss брал id из поля SERIAL в таблице

У тебя какой тип? CMP или BMP? Если CMP, то надо смотреть специфический дескриптор jboss-a, где обычно такие вещи настраиваются. Здесь я не помошник, JBoss не юзаю в production.
А если BMP - то можно грамотно autoincrement-поле замутить.

Автор: Rusico 13.7.2007, 15:48
у меня видимо CMP, хотя я, честно, не знаю чем эти два типа отличаются.
Я просто создал в META-INF jbosscmp-jdbc.xml? поэтому и думаю что у меня CMP
Может я заблуждаюсь? - тогда как определить какой у меня тип?

Автор: ekr 13.7.2007, 15:56
Загляни в ejb-jar.xml и найди следующий кусок:
Код

<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd">
<ejb-jar>
   <display-name>HelloEntity</display-name>
   <enterprise-beans>
      <entity>
         <description>Extremely Simple Entity bean, models a person</description>
         <ejb-name>HelloEntity</ejb-name>
         <home>HelloEntityHome</home>
         <remote>HelloEntity</remote>
         <ejb-class>HelloEntityEJB</ejb-class>
         <persistence-type>Container</persistence-type>
         <prim-key-class>java.lang.String</prim-key-class>
         <primkey-field>name</primkey-field>
         <reentrant>False</reentrant>
         <cmp-field><field-name>name</field-name></cmp-field>
         <cmp-field><field-name>email</field-name></cmp-field>
      </entity>
   </enterprise-beans>
</ejb-jar>


В разделе <persistence-type> и указан тип персистенции: Container для CMP или Bean для BMP.

Добавлено через 3 минуты и 3 секунды
Цитата(Rusico @  13.7.2007,  15:48 Найти цитируемый пост)
хотя я, честно, не знаю чем эти два типа отличаются

В случае CMP логику создания, удаления, загрузки и сохранения (jdbc код + sql-запросы) пишет сам контейнер, надо только задекларировать свойства в ejb-jar.xml и меппинги свойств бина на базу. Как раз в том самом jbosscmp-jdbc.xml.
А в случае BMP всю логику персистенции надо писать руками.

Автор: Rusico 13.7.2007, 16:02
так вот что это значит smile
Ну я возложил эту обязанность на контейнер, значит у меня Container MP smile

Если б сам БИН следил за сохранением своего состояния, то тут вопросов наверное не возникло бы.

Автор: ekr 13.7.2007, 16:06
Цитата(Rusico @  13.7.2007,  16:02 Найти цитируемый пост)
Если б сам БИН следил за сохранением своего состояния, то тут вопросов наверное не возникло бы.

Бин (cmp или bmp) не следит ))) Это делает в любом случае контейнер. Другое дело, кто пишет логику сохранения - Вы или контейнер.

Добавлено через 56 секунд
Цитата(Rusico @  13.7.2007,  16:02 Найти цитируемый пост)
Ну я возложил эту обязанность на контейнер, значит у меня Container MP smile

и правильно )))
человек должен думать, машина - работать. (С) не мое )

Автор: Ulysses4j 13.7.2007, 16:35
META-INF/jbosscmp-jdbc.xml
Код
<jbosscmp-jdbc>
  <enterprise-beans>
<!-- ... -->
    <entity>
<!-- ... -->
      <cmp-field>
        <field-name>xxxID</field-name>
        <column-name>id</column-name>
        <auto-increment/>
<!-- ... -->
      </cmp-field>
<!-- ... -->
    </entity>
<!-- ... -->
</jbosscmp-jdbc>

Автор: Rusico 13.7.2007, 16:41
а у меня вот так:

Код

<jbosscmp-jdbc>
  <defaults>
    <datasource>java:/PostgresDS</datasource>
    <datasource-mapping>PostgreSQL</datasource-mapping>
    <create-table>true</create-table>
    <remove-table>true</remove-table>
  </defaults>

  <enterprise-beans>
    <entity>
      <ejb-name>myEjb</ejb-name>
      <table-name>myEjb</table-name>
      <cmp-field>
        <field-name>id</field-name>
        <column-name>id</column-name>
      </cmp-field>
      <cmp-field>
        <field-name>name</field-name>
        <column-name>name</column-name>
      </cmp-field>

      
      <unknown-pk>
        <unknown-pk-class>java.lang.Long</unknown-pk-class>
        <column-name>id</column-name>
        <auto-increment/>
      </unknown-pk>
      
      <entity-command name="postgresql-fetch-seq"></entity-command>
    </entity>
  </enterprise-beans>
</jbosscmp-jdbc>


Это не правильно?

Добавлено через 1 минуту и 54 секунды
и даже если xml правльный, то как тогда будет выглядеть метод create в Home-интерфейсе?

Автор: ekr 14.7.2007, 15:05
Цитата(Rusico @  13.7.2007,  16:41 Найти цитируемый пост)
Это не правильно?

Не знаю ((( 
Я jboss не юзаю. Судя по структуре, все гуд, у weblogic и websphere похожая суть специфического дескриптора cmp бинов.

Цитата(Rusico @  13.7.2007,  16:41 Найти цитируемый пост)
как тогда будет выглядеть метод create в Home-интерфейсе?

Метод create home-интерфейса будет принимать от клиента параметры. Это будут значения свойств сущности, которую надо внести в базу. Свойства все, кроме первичного ключа, т.е. клиент не будет передавать его.
После декларации сигнатуры метода create в home-интерфейсе надо написать метод ejbCreate в классе реализации. Метод ejbCreate принимает тот же набор параметров, что и метод create home-интерфейса.  В теле ejbCreate надо полученными как параметры значениями проинициализировать свойства бина через set-методы. 
Помимо инициализации свойств, метод ejbCreate так же отвечает за создание значения первичного ключа. Т.к. клиент нам его не передал, то надо сгенерить. А это ломает делать ))) Поэтому мы просто возвращаем из метода ejbCreate значение null, показывая, что пусть контейнер париться. А делать он будет это на основе информации из дескриптора jbosscmp-jdbc.xml.

Автор: Rusico 15.7.2007, 20:30
спасибочки за разъяснения, обязательно попробую как окажусь на работе,
 и отпишусь.

Автор: Ulysses4j 15.7.2007, 21:42
Можете попробовать еще заменить
Код
      <cmp-field>
        <field-name>id</field-name>
        <column-name>id</column-name>
       </cmp-field>
      
      <unknown-pk>
        <unknown-pk-class>java.lang.Long</unknown-pk-class>
        <column-name>id</column-name>
        <auto-increment/>
      </unknown-pk>

на
Код

            <unknown-pk>
                <unknown-pk-class>java.lang.Integer</unknown-pk-class>
                <field-name>locationID</field-name>
                <column-name>id</column-name>
                <auto-increment/>
            </unknown-pk>

Так будет больше похоже на то, что в моей книжке по JBoss написано.

Автор: Rusico 16.7.2007, 10:43
сказал как сказал ekr и Ulysses4j, но контейнер пытается вставить в поле id null и 
естественно Postgres ругается.

Автор: Ulysses4j 16.7.2007, 11:09
Блин, у меня там куча ошибок: вместо Long - Integer, и вместо id - locationId - копипастинг... ;)  

А как вот такой радикальный эксперимент: заменить все-таки тип id на Integer и написать:
Код

            <unknown-pk>
                <unknown-pk-class>java.lang.Integer</unknown-pk-class>
                <field-name>id</field-name>
                <column-name>id</column-name>
                <jdbc-type>INTEGER</jdbc-type>
                <sql-type>INTEGER</sql-type>
                <auto-increment/>
            </unknown-pk>

?

Добавлено через 1 минуту и 10 секунд
А, не, наверное, не поможет.

Автор: Rusico 16.7.2007, 11:15
Да, у меня сейчас Integer:
Код

<unknown-pk>
    <unknown-pk-class>java.lang.Integer</unknown-pk-class>
    <column-name>id</column-name>
    <auto-increment/>
</unknown-pk>
<entity-command name="postgresql-fetch-seq"></entity-command>


а вот на счёт 
Код

<jdbc-type>INTEGER</jdbc-type>
<sql-type>INTEGER</sql-type>


сейчас попробую

Добавлено через 2 минуты и 4 секунды
не, упорно запихивает в id null

Добавлено через 4 минуты и 26 секунд
может проблема в 
Код

<entity-command name="postgresql-fetch-seq"></entity-command>


может другая какая строка должна быть?

Ведь, как я понимаю это команда для генерации нового идентификатора? вот может
он и не может сгенерить id.

Автор: ekr 16.7.2007, 11:29
Цитата(Rusico @  16.7.2007,  11:15 Найти цитируемый пост)
postgresql-fetch-seq

не спец по subj, но, может, здесь надо указать имя sequence, из которой вытягиваются уникальные значения?

Автор: Rusico 16.7.2007, 11:35
ставлю конкретный, относящийся к таблице Prodact_id_seq, а от гад smile даже деплоить не хочет!

Добавлено через 1 минуту и 30 секунд
ставлю оригинальный, относящийся к таблице Prodact Prodact_id_seq,
 а он гадsmile даже деплоить не хочет

Добавлено через 4 минуты и 8 секунд
доберусь до правды smile 

Автор: Rusico 16.7.2007, 12:39
Вот ещё что интересно - сделал тоже с Mysql и заработало!!!, а с Postgresql всё равно не хочет.

Автор: ekr 16.7.2007, 14:32
см. http://www.ubookcase.com/book/Sams/JBoss.4.0.The.Official.Guide/0672326485/ch11lev1sec11.html

кстати, а какой exception выбрасывается при развертывании?

Автор: Rusico 16.7.2007, 15:57
Итак, пишу о проделанной работе и полученных ответах:

вот така конструкция: 
Код

<unknown-pk>
    <unknown-pk-class>java.lang.Integer</unknown-pk-class>
    <column-name>id</column-name>
    <jdbc-type>INTEGER</jdbc-type>
    <sql-type>INTEGER</sql-type>
    <auto-increment/>
</unknown-pk>
<entity-command name="postgresql-fetch-seq" class="org.jboss.ejb.plugins.cmp.jdbc.keygen.JDBCPostgreSQLCreateCommand"/>


работает на ура, если имя postgresql-fetch-seq такое каким его создал postgres (логично smile)
далее - имена таблиц долны быть в нижнем регистре (почему-то).

Огромное спасибо всем кто отвечал - вроде я разобрался  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)