Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работают взаимосвязи в CMP (EJB 2.0), Сложновато как-то... 
V
    Опции темы
Maverick
  Дата 16.2.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Добрый день... не мог бы кто-нить объяснить....

Вот есть два CMP .... Bean1 и Bean2... Оба CMP... 
В Bean1 есть CMP-поля int key, String name.... В Bean1 аналогично есть CMP-поля key, name...

Создаем хваленную контейнерную взаимосвязь в Bean1 к Bean2... пусть односторонню, пусть один-к-одному....

Скажем в ejb-конструкторе Bean2 будет написано create(1,"test2")... создается прекрасно... 

Что будет написано в конструкторе Bean1?  create(1, "test1", ......... (видимо, указатель на второй бин каким-то образом?)).... 

Как это организовать? Каким образом? У меня очень много бинов-классов получается, очень трудно эти связи фасадами удерживать... Слишком много кода... Подскажите, пожалуйста, подробно как правильно организовать контейнерную связь между двумя CMP? В последнее время прочел очень много статей, но везде что-то опускается как само собой разумеещееся... 




--------------------
smile
PM ICQ GTalk   Вверх
Maverick
Дата 16.2.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Кто-нить вообще юзает EJB 2.0??? Или это глас вопиющего в пустыне?? smile 


--------------------
smile
PM ICQ GTalk   Вверх
tux
Дата 16.2.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Maverick @  16.2.2007,  14:57 Найти цитируемый пост)
Кто-нить вообще юзает EJB 2.0??? Или это глас вопиющего в пустыне?? 

Юзали многие, но года 4-5 назад. Сейчас сомневаюсь, что много проектов на них построены.
PM MAIL Skype GTalk Jabber YIM   Вверх
Maverick
Дата 16.2.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Ужас.... что посоветуете? пероползать на EJB3? сильно отличается?

Блин, мы их уже два -три месяца тужимся и мучаем....  smile

Добавлено @ 15:30 
Как же все-таки связи организовать правильно?? Пока не разберусь - не переползу ни на что...

Добавлено @ 15:31 
И вообще... что EJB2.0 4-5 лет назад была??... А какого же тогда Sun до последнего времени их пропагандировала??


--------------------
smile
PM ICQ GTalk   Вверх
tux
Дата 16.2.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Maverick @  16.2.2007,  15:29 Найти цитируемый пост)
А какого же тогда Sun до последнего времени их пропагандировала?? 

Ну... Не стоит во всем доверяться Sun'у smile Вообще persistence в большинстве проектов сейчас на Hibernate или EJB3. Насчет EJB 2.0. Вечером доползу до дому, попробую вспомнить.
PM MAIL Skype GTalk Jabber YIM   Вверх
Maverick
Дата 16.2.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Спасибо... ждем до понедельника...  smile 


--------------------
smile
PM ICQ GTalk   Вверх
tux
Дата 18.2.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Maverick @  16.2.2007,  10:46 Найти цитируемый пост)
Что будет написано в конструкторе Bean1?  create(1, "test1", ......... (видимо, указатель на второй бин каким-то образом?)).... 

Должен быть указатель на локальный или удаленный интерфейс. Как это должно быть описано в ejb-jar.xml не нашел. В старых проектах все кроме самой реализации EJB генерируется с помощью XDoclet, настраивать его муторно.

Добавлено @ 22:41 
Цитата(Maverick @  16.2.2007,  15:29 Найти цитируемый пост)
мы их уже два -три месяца тужимся и мучаем.... 

Мучались дольше, но тогда спросить было не у кого. Все-таки рекомендовал бы перейти с EJB 2.0 на что-то другое если вам не нужны распределенные транзакции. Альтернатив множество - EJB 3.0, Hibernate, iBatis.
PM MAIL Skype GTalk Jabber YIM   Вверх
Maverick
Дата 19.2.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Так это все IDE по умолчанию создают локальный, но локальный невозможно создать вне контейнера насколько я понимаю? Как же вызвать такой метод из веб-приложения скажем?? путсть оно на том же сервере крутится?? Или все равно получается надо фасадами обкручивать все, просто фасады чуток проще получаются....

вот так можно получить ссылку на удаленный интерфейс... 
Bean2Bean");
Код

 Bean2RemoteHome bean2RemoteHome = (Bean2RemoteHome) ic.lookup("ejb/Bean2Bean");

как же тогда получить на локальный ссылку? в том же фасаде??


Скорее всего именно они и нужны... кластеризация, чудовищные объемы и все такое... спросить тож не у кого... Этот XDoclet есть у меня, и даже JDoclet... пока эту гадость изучишь - уже глова лопнет... А потом еще EJB ковырять... Наверно, надо на третий уходить... огородами... Уйду обрато в Дельфи... smile


--------------------
smile
PM ICQ GTalk   Вверх
tux
Дата 19.2.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Maverick @  19.2.2007,  10:56 Найти цитируемый пост)
Как же вызвать такой метод из веб-приложения скажем??

Из веб-приложения, которое в той же JVM крутится без проблем. Если на другом сервере, тогда нужен удаленный. С ним, насколько я понимаю проблем быть не должно, все примерно так же, как и с локальными. Однако, есть одно "но". Удаленно вызывать Entity бины не рекомендуется - изменение каждого атрибута (коих обычно много) потребует сетевого вызова, что по производительности, сам понимаешь, не будет соответствовать никаким требованиям. Поэтому так и поступают, все оборачивают фасадами, используя различные паттерны и кучу дополнительного кода. Так что, альтернативы две - либо приложение, крайне неэффективное по производительности либо монструозное с точки зрения количества вспомогательного кода. 

Цитата(Maverick @  19.2.2007,  10:56 Найти цитируемый пост)
Этот XDoclet есть у меня, и даже JDoclet... пока эту гадость изучишь - уже глова лопнет...

На самом деле там все не так уж сложно. И если уж занялись EJB, то рекомендовал бы изучить, сильно помогает и избавляет от необходимости синхронизировать постоянно состояние бина и десяток интерфейсов и XML-дескрипторов. 

Цитата(Maverick @  19.2.2007,  10:56 Найти цитируемый пост)
Скорее всего именно они и нужны... кластеризация, чудовищные объемы и все такое... 

Это еще не повод использовать EJB. Вот если есть несколько баз данных на разных серверах, которые между собой связать средствами самих СУБД не получится, тогда да, EJB, и то можно обойтись без них. Есть более легкие средства для обеспечения межбазного взаимодействия. Ну или в конце концов можно на EJB 3.0 переползти. Сам не работал, но народ хвалит.

Цитата(Maverick @  19.2.2007,  10:56 Найти цитируемый пост)
Наверно, надо на третий уходить... огородами... Уйду обрато в Дельфи... smile 

Вот-вот. Такого рода технологии и приводят к тому, что считается, что Java - это безумно сложно.
PM MAIL Skype GTalk Jabber YIM   Вверх
chief39
Дата 20.2.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 11
Всего: 77



В двух словах:

Энтити лучше делать локальные, почему - Tux описал.
Заворачиваешь в фасады.
Методы фасадов должны отвечать сформулированным человеческими словами запросам и действиям.
То есть быть более крупнозернистыми.
Плюс, на входе/выходе методов фасадов должы быть transfer objects(паттерн).
Энтити желательно за пределы фасада не выносить как понятие.
И работать в основном с локальными энтити.
Если должны взаимодействовать два сервера - пусть взаимодействуют через фасады - так будет скрыта работа с БД и энтити можно будет легко поотм изменить/заменить.
Плюс - скорость


маленькие куски из рабочего ejb-jar:
Бин - Тип Категорий и бин Категория. Связь, весьма очевидно - один ко многим.
Думаю, тут всё прозрачно, более конкретные вопросы задавай по мере появления, буит врем- отвечу.
На еджиби-кьюэльные запросы пока внимания не обращай, пропусти мимо ушей их.

Тип категорий
Код

<entity>
            <ejb-name>CustomerCategoryTypeBean</ejb-name>
            <local-home>
                com.ubs.businessmodel.customersmetadata.ejb.entity.CustomerCategoryTypeLocalHome
            </local-home>
            <local>
                com.ubs.businessmodel.customersmetadata.ejb.entity.CustomerCategoryTypeLocal
            </local>
            <ejb-class>
                com.ubs.businessmodel.customersmetadata.ejb.entity.CustomerCategoryTypeBean
            </ejb-class>
            <persistence-type>Container</persistence-type>
            <prim-key-class>java.lang.Long</prim-key-class>
            <reentrant>False</reentrant>
            <cmp-version>2.x</cmp-version>
            <abstract-schema-name>CustomerCategoryType</abstract-schema-name>
            <cmp-field>
                <field-name>sid</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>name</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>description</field-name>
            </cmp-field>
            <primkey-field>sid</primkey-field>
            <query>
                <query-method>
                    <method-name>findByName</method-name>
                    <method-params>
                        <method-param>java.lang.String</method-param>
                    </method-params>
                </query-method>
                <ejb-ql><![CDATA[SELECT OBJECT(x) FROM CustomerCategoryType x WHERE x.name=?1]]></ejb-ql>
            </query>
        </entity>



Категории
Код

<entity>
            <ejb-name>CustomerCategoryBean</ejb-name>
            <local-home>
                com.ubs.businessmodel.customersmetadata.ejb.entity.CustomerCategoryLocalHome
            </local-home>
            <local>
                com.ubs.businessmodel.customersmetadata.ejb.entity.CustomerCategoryLocal
            </local>
            <ejb-class>
                com.ubs.businessmodel.customersmetadata.ejb.entity.CustomerCategoryBean
            </ejb-class>
            <persistence-type>Container</persistence-type>
            <prim-key-class>java.lang.Long</prim-key-class>
            <reentrant>False</reentrant>
            <cmp-version>2.x</cmp-version>
            <abstract-schema-name>CustomerCategory</abstract-schema-name>
            <cmp-field>
                <field-name>sid</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>customerCategoryTypeSid</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>name</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>description</field-name>
            </cmp-field>
            <primkey-field>sid</primkey-field>
            <query>
                <query-method>
                    <method-name>findByCategoryTypeSid</method-name>
                    <method-params>
                        <method-param>java.lang.Long</method-param>
                    </method-params>
                </query-method>
                <ejb-ql><![CDATA[SELECT OBJECT(x) FROM CustomerCategory x WHERE x.customerCategoryTypeSid=?1]]></ejb-ql>
            </query>
            <query>
                <query-method>
                    <method-name>findByNameAndType</method-name>
                    <method-params>
                        <method-param>java.lang.String</method-param>
                        <method-param>java.lang.Long</method-param>
                    </method-params>
                </query-method>
                <ejb-ql>
                    <![CDATA[SELECT OBJECT(x) FROM CustomerCategory x WHERE x.name=?1 and x.customerCategoryTypeSid=?2]]></ejb-ql>
            </query>

        </entity>





Описание релэйшнов, то есть таких себе форейн ки smile
Код


<relationships>
        <ejb-relation>
            <ejb-relation-name>CategoryType-Category</ejb-relation-name>
            <ejb-relationship-role>
                <ejb-relationship-role-name>categorytype-category</ejb-relationship-role-name>
                <multiplicity>One</multiplicity>
                <relationship-role-source>
                    <ejb-name>CustomerCategoryTypeBean</ejb-name>
                </relationship-role-source>
                <cmr-field>
                    <cmr-field-name>customerCategories</cmr-field-name>
                    <cmr-field-type>java.util.Set</cmr-field-type>
                </cmr-field>
            </ejb-relationship-role>
            <ejb-relationship-role>
                <ejb-relationship-role-name>category-categorytype</ejb-relationship-role-name>
                <multiplicity>Many</multiplicity>
                <relationship-role-source>
                    <ejb-name>CustomerCategoryBean</ejb-name>
                </relationship-role-source>
                <cmr-field>
                    <cmr-field-name>customerCategoryType</cmr-field-name>
                </cmr-field>
            </ejb-relationship-role>
        </ejb-relation>
</relationships>



ЗЫ: Рекомендую поглядеть на еджиби 3.0
Для себя(для понимания) можно попробовать несколько рабочих примеров на 2.0(2.1) но что-то серьёзное - лучше уже на 3.0
Все преимущества 2.1 но гораздо меньше ворох кода. Проектировать новую систему под морально устаревающую технологию не стоит, сан уже вовсю 3.0 пропагирует, короая собрала в себя наработки хибернейта и многих других полезных фреймворков.
2.0 и впрямь тяжеловата в плане количества поддерживаемого кода и его массивности









--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Maverick
Дата 20.2.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



chief39, я все это проделывал много раз... и разметки такие же получаются... и запросы тоже мутил - работают... горы фасадов наработано... но их слишком много - трудно контролировать их уже...  потому что связи между cmp я сам поддерживаю... 

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

Добавлено @ 15:21 
Например:

есть страна
Код

/**
 * Created by IntelliJ IDEA.
 * User: u0109
 * Date: 02.02.2007
 * Time: 11:19:20
 */
package firmsEJB;

import jndiNames.ICounterNames;
import jndiNames.IAddressNames;

import javax.ejb.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.rmi.RemoteException;

public abstract class CountryBean implements EntityBean {
  
    //конструкторы
    public Integer ejbCreate(Integer key, String code, String name) throws CreateException {

        setId(key);
         setCode(code);
          setName(name);

        return key;
    }

    public void ejbPostCreate(Integer key, String code, String name) throws CreateException {

    }

    public Integer ejbCreate(String code, String name) throws CreateException {

        Integer key = -1;
        try {
            InitialContext ic = new InitialContext();
            NewCounterFacadeHome newCounterFacadeHome = (NewCounterFacadeHome)
                                          ic.lookup(ICounterNames.JNDI_NewCounterFacadeEJB);
            try {
                NewCounterFacade newCounterFacade = newCounterFacadeHome.create();
                key = newCounterFacade.getNewCounter(IAddressNames.JNDI_CountryEJB);

                  setId(key);
                   setCode(code);
                    setName(name);

            } catch (RemoteException e) {
                e.printStackTrace();
            }
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return key;
    }

    public void ejbPostCreate(String code, String name) throws CreateException {

    }
    //------------
    public CountryBean() {
    }

    public void setEntityContext(EntityContext entityContext) throws EJBException {
    }

    public void unsetEntityContext() throws EJBException {
    }

    public void ejbRemove() throws RemoveException, EJBException {
    }

    public void ejbActivate() throws EJBException {
    }

    public void ejbPassivate() throws EJBException {
    }

    public void ejbLoad() throws EJBException {
    }

    public void ejbStore() throws EJBException {
    }

    public abstract Integer getId();

    public abstract void setId(Integer id);

    public abstract String getCode();

    public abstract void setCode(String code);

    public abstract String getName();

    public abstract void setName(String name);
}



и есть регион

Код

/**
 * Создано Мавров С.Я (Maverick).
 * User: u0109 * Date: 08.02.2007 * Time: 13:31:18*
 * [описание класса]
 */
package firmsEJB;

import jndiNames.ICounterNames;
import jndiNames.IAddressNames;

import javax.ejb.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.rmi.RemoteException;

public abstract class RegionBean implements EntityBean {


    //конструкторы
    public Integer ejbCreate(Integer key, String code, String name, Integer idCountry)
            throws CreateException {

        setId(key);
         setCode(code);
          setName(name);
           setIdCountry(idCountry);

        return key;
    }

    public void ejbPostCreate(Integer key, String code, String name, Integer idCountry)
            throws CreateException {

    }

    public Integer ejbCreate(String code, String name, Integer idCountry)
            throws CreateException {

        Integer key = -1;
        try {
            InitialContext ic = new InitialContext();
            NewCounterFacadeHome newCounterFacadeHome = (NewCounterFacadeHome)
                                          ic.lookup(ICounterNames.JNDI_NewCounterFacadeEJB);
            try {
                NewCounterFacade newCounterFacade = newCounterFacadeHome.create();
                key = newCounterFacade.getNewCounter(IAddressNames.JNDI_RegionEJB);

                  setId(key);
                   setCode(code);
                    setName(name);
                     setIdCountry(idCountry);

            } catch (RemoteException e) {
                e.printStackTrace();
            }
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return key;
    }

    public void ejbPostCreate(String code, String name, Integer idRegion)
            throws CreateException {

    }
    //------------

    public RegionBean() {
    }

    public void setEntityContext(EntityContext entityContext) throws EJBException {
    }

    public void unsetEntityContext() throws EJBException {
    }

    public void ejbRemove() throws RemoveException, EJBException {
    }

    public void ejbActivate() throws EJBException {
    }

    public void ejbPassivate() throws EJBException {
    }

    public void ejbLoad() throws EJBException {
    }

    public void ejbStore() throws EJBException {
    }

    public abstract Integer getId();

    public abstract void setId(Integer id);

    public abstract String getCode();

    public abstract void setCode(String code);

    public abstract String getName();

    public abstract void setName(String name);

    public abstract Integer getIdCountry();

    public abstract void setIdCountry(Integer idCountry);
}



Регион знает свою страну... По уму надо связать компонтенты напрямую и пускай контейнер разбирается, что к чему...
Вместо этого я в регионе храню идентификатор страны, а потом в большом фасаде Адрес собираю воедино... Но если учесть, что много бинов - страна, регион, город, тип улицы, почтовые данные и тп и тд - фасад получается монстроидальный... вместо того, чтобы создать регион и успокоится - я создаю и регион и страну, и еще куча проверов всяких... 


--------------------
smile
PM ICQ GTalk   Вверх
chief39
Дата 20.2.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 11
Всего: 77



Цитата(Maverick @  20.2.2007,  15:12 Найти цитируемый пост)
вместо того, чтобы создать регион и успокоится - я создаю и регион и страну

Гм... эт как? Даже прямым скл в базе нужна страна, а потом регион создавать уже со ссылкой на страну.


Цитата(Maverick @  20.2.2007,  15:12 Найти цитируемый пост)
Но если учесть, что много бинов - страна, регион, город, тип улицы, почтовые данные и тп и тд - фасад получается монстроидальный...

Никуда не деться. Если ты всё это перенесёшь в БД и построишь логику на процедурах - они будут такими же.

Если ты имеешь в виду:
Есть регион(его айди), нужно вытянуть экзепляр бина связанной страны, тогда:

findbyprimarykey по регионам - получение бина региона,
получение айдишки страны геттером,
findbyprimarykey по странам с имеющимся айди страны

или

Описывается запрос на ejb-ql в котором идёт выборка по двум бинам и возвращается в качестве обжекта бин страны. Тогда это вопрос в кьюэлю, задавай.
Референсы - это всего лишь копию форейн ки поверх БД. Для ограничения целостности и подсказки кьюэль запросам кого и по чём можно связать.

Или я во что-то недовъехал? smile

Добавлено @ 17:17 
Цитата(Maverick @  20.2.2007,  15:12 Найти цитируемый пост)
меня больше интересует код классов и интерфейсов этих двух бинов... если можно их показать - будет великолепно... до меня не доходит - как получить ссылку на локальный интерфейс свзянного бина... что должно быть в ejbAfterPost? вернее, что должно быть, я знаю... а вот как это написать - не понимаю...

Судя по всему, это то о чём я говорил, афтерпост тут не при чём - это работа файндеров, которые ты напишешь


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Maverick
Дата 20.2.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Я, видимо, что-то неправильно объясняю...

Расмотрим обычные классы...
Код


   class Country{
      Int id;
      String code;
      String name;
         ....
        
   }
  


Код


    class Region
        Int id;
        String code;
        String name;
        Country country;
         .....



Отображаем их в бины ....  Country отобразится в бин напрямую поскольку все поля простые... А Region не сможет... Так как поле country сложного типа...

Я вообще-то думал, что EJB2 позволит мне отобразить эту связь почеловечески... 
Во всех статьях указано, что контейнер сам возьмет на себя обязанность отслеживать связанные классы... Вместо этого мне в бине RegionBean приходится держать простое поле idCountry и хранить в нем привязанный идентификатор страны, а потом самому собирать все это... Это ненормально - когда класс не проектируется сам в базу...

Добавлено @ 17:55 
Вообще-то считал, что будет как-то так

Код


      CountryBeanRemote countryBeanRemote = (CountryBeanRemote) ic.lookup("ejb/CountryBean");
      CountryBean countryBean = countryBeanRemote.create(new Int(1), "840", "США");
     
      RegionBeanRemote regionBeanRemote = (RegionBeanRemote) ic.lookup("ejb/CountryBean");
      RegionBean regionBean = regionBeanRemote.create(new Int(1), "452", "Канзас", countryBean );
  


Чтобы контейнер сам понял, что имеется в виду в под countryBean... 
а счас я делаю так...

Код


      CountryBeanRemote countryBeanRemote = (CountryBeanRemote) ic.lookup("ejb/CountryBean");
      CountryBean countryBean = countryBeanRemote.create(new Int(1), "840", "США");
     
      RegionBeanRemote regionBeanRemote = (RegionBeanRemote) ic.lookup("ejb/CountryBean");
      RegionBean regionBean = regionBeanRemote.create(new Int(1), "452", "Канзас", countryBean.getId() );
  


Это ненормально... это EJB1 какой-то...



--------------------
smile
PM ICQ GTalk   Вверх
Mikamj
Дата 20.2.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.2.2007
Где: Владимир

Репутация: 1
Всего: 1



Цитата(Maverick @ 20.2.2007,  15:46)
Отображаем их в бины ....  Country отобразится в бин напрямую поскольку все поля простые... А Region не сможет... Так как поле country сложного типа...

Я вообще-то думал, что EJB2 позволит мне отобразить эту связь почеловечески... 
Во всех статьях указано, что контейнер сам возьмет на себя обязанность отслеживать связанные классы... Вместо этого мне в бине RegionBean приходится держать простое поле idCountry и хранить в нем привязанный идентификатор страны, а потом самому собирать все это... Это ненормальо - когда класс не проектируется сам в базу...


В EJB с CMP есть понятие CMR-поля. Это поле должно быть типа локального (и только локального!) компонентного интерфейса другого EntityBean. 

Допустим мы имеем Entity-компонент Book и Bookcase (книги лежат на книжной полке). При этом в компоненте Book есть ссылка на полку, на которой находится книга. В этом случае методы ejbCreate и ejbPostCreate компонента Book выглядят так:

Код

public PrimaryKey ejbCreate(BookInfo bookInfo) 
    throws CreateException {
    create("Book"); //Механизм Sequence Service для генерации уникальных первичных ключей (просто устанавливается поле id)
    setName(bookInfo.getName());
    setAuthor(bookInfo.getAuthor());
    setPublisher(bookInfo.getPublisher());
    setPages(bookInfo.getPages());
    setYear(bookInfo.getYear());
    setIsbn(bookInfo.getIsbn());
    setWriteoff(bookInfo.getWriteoff());
    return null;
  }

  public void ejbPostCreate(BookInfo bookInfo) 
    throws CreateException {
    setBookcase(bookcaseHome.findByPrimaryKey(new PrimaryKey( // bookcaseHome ищем в методе setEntityContext
        bookInfo.getBoookcase().getId()))
      );
  }


В фасаде (кстати можно сделать отдельные фасады для каждой сущности, чтобы они гигантских размеров не получались) добавление книги быдет выглядеть следующим образом:

Код

bookHome.create(bookInfo);


Отображением системы Entity-компонентов на БД происходит с использованием спец. XML-дескриптора. В данном случае связи в базе будут аналогичными. Однако ничто не мешает в Entity-компоненте Bookcase сделать ссылку типа Collection<BookLocalHome>, а потом настроить правильное отображение этой системы на БД.
PM WWW ICQ   Вверх
Maverick
Дата 21.2.2007, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Mikamj, ты просто супер... именно то самое...

последний вопрос  "bookcaseHome ищем в методе setEntityContex" - как это сделать?? каким образом?? покажи код, пожалуйста... 


--------------------
smile
PM ICQ GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.