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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В контексте сохраняется не первичный ключ (EB 2.x) 
V
    Опции темы
Ulysses4j
Дата 15.7.2007, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть BMP Entity bean 2.x с двумя персистентными полями типа String: id, name. При ejbLoad()
Код
(String)this.context.getPrimaryKey();

вовращает значение name. А я, соответственно, хочу, чтобы было id. Как этого добиться?

Это сообщение отредактировал(а) Ulysses4j - 15.7.2007, 03:53


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
ekr
Дата 15.7.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

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



Поле name трактуется как PK.
Чтобы PK стало поле id надо эти значения возвращать из метода ejbCreate().


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
Ulysses4j
Дата 15.7.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так оно и есть. Но не помогает... Я не слишком силен в понимании жизненого цикла бинов, но, кажется, ни ejbCreate(), ни ejbFindByPrimaryKey(String id) (учитывая, что ошибка происходит при обращении к одному из finders) не вызывается - я ставил вывод в консоль сообщений: вроде бы вызывается setEntityContext(EntityContext ctx) и ejbLoad(), и вот в ejbLoad() такая ерунда. На всякий случай код ejbCreate(String name):
Код
    public String ejbCreate(String name) throws SQLException {
        this.initDataSource();
        this.name = name;
        final String query =
            "INSERT INTO faculty(name) VALUES(?)";
        Connection con = null;
        PreparedStatement st = null;
        ResultSet generatedKeys = null;
        try {
            con = this.dataSource.getConnection();
            st = con.prepareStatement(query);
            st.setString(1, this.name);
            st.executeUpdate();
            generatedKeys = st.getGeneratedKeys();
            if ( generatedKeys.next() ) {
                this.id = generatedKeys.getString(1);
                System.out.println("Primary key is: " + this.id);
            } else
                throw new SQLException("A problem with auto-generated keys");
        } finally {
            try { st.close(); } catch(Exception ex) {}
            try { con.close(); } catch(Exception ex) {}
        }      
        return this.id;
    }

У меня id - auto_generated.

Это сообщение отредактировал(а) Ulysses4j - 15.7.2007, 13:50


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
ekr
Дата 15.7.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

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



Тогда надо убедиться, что методы ejbFindXXX() в классе реализации содержат правильный sql-запрос и возвращают значение именно поля id.

FYI: метод ejbCreateXXX(...) вызывается контейнером у объекта реализации (т.н. bean instance), когда клиент вызывает у фабрики (EJBHome) метод createXXX(...)

Добавлено через 1 минуту и 59 секунд
Цитата(Ulysses4j @  15.7.2007,  13:49 Найти цитируемый пост)
и вот в ejbLoad() такая ерунда

Цитата(Ulysses4j @  15.7.2007,  13:49 Найти цитируемый пост)
ошибка происходит при обращении к одному из finders

это случается при вызове какого именно finder-метода? нужно проверить правильность соответствующего ejbFindXXX() метода.


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
Ulysses4j
Дата 15.7.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Действительно, этот findXXX() (вернее, ejbFindXXX) возвращал name, а не id. Теперь зарботало. Извините, за глупый вопрос и спасибо, огромное!

ekr, а можно такой вопрос по дизайну: если в сервлете несколько раз используется один и тот же бин (EB; например несколько раз findXXX вызывается, но в разных методах-обработчиках запросов, получаемых этим сервлетом), то насколько хорошо сделать сервлету поле типа домашнего интерфейса, инициализировать его в init() и дальше пользоваться им? Или все-таки лучше каждый раз заново его искать?

Это сообщение отредактировал(а) Ulysses4j - 15.7.2007, 14:59


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
ekr
Дата 15.7.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

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



Цитата(Ulysses4j @  15.7.2007,  14:58 Найти цитируемый пост)
спасибо, огромное!

не за что )))

Цитата(Ulysses4j @  15.7.2007,  14:58 Найти цитируемый пост)
то насколько хорошо сделать сервлету поле типа домашнего интерфейса, инициализировать его в init() и дальше пользоваться им?

Кеширование фабрики (EJBHome-объекта) - очень распространенная практика и очень благотворно влияет на нагрузочную масштабируемость. Т.к. соединение с сервисом именования (jndi) и поиск в нем - затратные операции.
Многие шаблоны проектирования (e.g. J2EE Core Pattern Service Locator) подразумевают такое кеширование.


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
Ulysses4j
Дата 15.7.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо-спасибо, так и сделаю! И про паттерны J2EE у вас читать буду!


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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