Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

EntityBean и PrimaryKey


asg ©   (2002-04-17 09:57:00) 

Теперь у меня вопрос по EntityBean и PrimaryKey, генерируемый БД.

Предположим, в БД Interbase имеется таблица:
CREATE TABLE FILIAL (
     IDFILIAL      INTEGER                           NOT NULL,
     NAMEFILIAL    NAME                              NOT NULL,
         PRIMARY KEY (IDFILIAL));

CREATE UNIQUE INDEX XAK1FILIAL ON FILIAL (NAMEFILIAL);
CREATE UNIQUE INDEX XPKFILIAL ON FILIAL (IDFILIAL);

Причем, IDFILIAL генерируется при помощи триггера
CREATE TRIGGER ADDFILIAL FOR FILIAL
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  if (NEW.IDFilial is null) then
      NEW.IDFilial = gen_id (GenIDFilial, 1);
END

Далее. Имеется EntityBean:
public interface FilialHome extends EJBHome
{
public Filial create(int idfilial, String namefilial) throws RemoteException, CreateException;
public Filial create(String namefilial) throws RemoteException, CreateException;
public Filial create(int idfilial) throws RemoteException, CreateException;
public Filial findByPrimaryKey(int primaryKey) throws RemoteException, FinderException;
}

public abstract class FilialBean implements EntityBean
{
EntityContext entityContext;
public int ejbCreate(int idfilial, String namefilial) throws CreateException
{
  setIdfilial(idfilial);
  setNamefilial(namefilial);
  return 0;
}
public int ejbCreate(int idfilial) throws CreateException
{
  return ejbCreate(idfilial, null);
}

public int ejbCreate(String namefilial) throws CreateException
{
}
public void ejbPostCreate(int idfilial, String namefilial) throws CreateException
{
}
public void ejbPostCreate(String namefilial) throws CreateException
{
}

public void ejbPostCreate(int idfilial) throws CreateException
{
  ejbPostCreate(idfilial, null);
}
public void ejbRemove() throws RemoveException
{
}
public void ejbActivate()
{
}
public void ejbPassivate()
{
}
public void ejbLoad()
{
}
public void ejbStore()
{
}
public void setEntityContext(EntityContext entityContext)
{
  this.entityContext = entityContext;
}
public void unsetEntityContext()
{
  entityContext = null;
}
public abstract int getIdfilial();
public abstract void setIdfilial(int idfilial);
public abstract String getNamefilial();
public abstract void setNamefilial(String namefilial);
}

Когда клиент вызывает метод Create(id, name), то все работает хорошо.
А вот когда клиент вызывает метод Create(name), то возникает Exception.

Подскажите, плиз, как сделать так, чтобы объект создавался, но ID при этом генерировался сервером БД.


Michelson   (2002-04-25 10:50:00) [1]

По спецификации EJB в методе ejbCreate твой IDFILIAL ДОЛЖЕН БЫТЬ ОПРЕДЕЛЕН ЕЩЕ ДО(!) ЗАПИСИ В СТРОКИ В ТАБЛИЦУ. И тригер тут не поможет.

Мы делали так:
1. Определяли в БД секвенсор для таблицы
2. Перед созданием EntityBean-a вытаскивали из него (секвенсора) следующий ID (для этого написали специальный SessionBean, но это как тебе удобно)
3. И с готовым ID делали новый бин:

public int ejbCreate(String namefilial) throws CreateException
{
ctx = new InitialContext();
Object ref = ctx.lookup("NextIdSessionBean");
NextIdSessionBeanHome home = (NextIdSessionBeanHome)ref;
NextIdSessionBean bean = home.create();
setIdfilial(bean.getNextIdFor("FILIAL"));
setNamefilial(namefilial);
}

В этом бине написан стандартный код с использованием JDBC типа
SELECT NEXTVAL FROM SEQUENCER..... Но это уже другая история


Наверх

Титульная страница Поиск, карта сайта Написать письмо