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


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

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

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

Автор: Ulysses4j 15.7.2007, 13:49
Так оно и есть. Но не помогает... Я не слишком силен в понимании жизненого цикла бинов, но, кажется, ни 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.

Автор: ekr 15.7.2007, 14:43
Тогда надо убедиться, что методы 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() метода.

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

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

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

не за что )))

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

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

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

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