Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений" |
Технология Enterprise Java Beans. Часть 2
Теперь перейдем к create методу компонента WidgetBean.В нем выполняется создание записи в базе данных, соответствующей компоненту. Делается это посредством метода Integer insertRow(String description, double price). Он создает новую запись в таблице базы данных, а потом возвращает ID созданной записи через запрос к WIDGET_ID_PKG. Метод ejbCreate() возвращает первичный ключ созданного экземпляра компонента, но клиентское приложение при вызове метода create домашнего интерфейса получит уже не первичный ключ, а удаленный интерфейс созданного компонента (см. WidgetRemote ). Метод ejbPostCreate () не выполняет никаких действий. При работе с BMP он вообще не используется. В нем иногда возникает необходимость при работе с CMP.
public Integer ejbCreate(String description, double price) throws CreateException { try { widgetId = insertRow(description, price); } catch (Exception ex) { throw new EJBException("ejbCreate: " + ex.getMessage()); } this.description = description; this.price = price; return widgetId; } public void ejbPostCreate(String description, double price) { } private Integer insertRow(String description, double price) throws SQLException { Connection con = null; PreparedStatement prepStmt = null; try { con = dataSource.getConnection(); String insertStatement ="insert into WIDGETS(DESCRIPTION, PRICE) values " + " (?, ?)"; prepStmt = con.prepareStatement(insertStatement); prepStmt.setString(1, description); prepStmt.setDouble(2, price); prepStmt.executeUpdate(); prepStmt.close(); prepStmt = con.prepareStatement("select " + WIDGET_ID_PKG.GET_LAST_ID from dual"); ResultSet r = prepStmt.executeQuery(); int id = -1; if (r.next()) { id = r.getInt(1); } if (id == -1) { throw new SQLException("Error getting last index"); } con.close(); return new Integer(id); } catch (Exception e) { } finally { if (prepStmt != null) { try { prepStmt.close(); } catch (Exception e) { } } if (con != null) { try { con.close(); } catch (Exception e) { } } } return null; }
При помощи метода ejbRemove() выполняется удаление экземпляра компонента из базы данных. Из него вызывается метод deleteRow (Integer id), который удаляет запись в базе данных с соответствующим первичным ключом.
public void ejbRemove() { try { deleteRow(widgetId); } catch (Exception ex) { throw new EJBException("ejbRemove: " + ex.getMessage()); } private void deleteRow(Integer widgetId) throws SQLException { Connection con = null; PreparedStatement prepStmt = null; try { con = dataSource.getConnection(); String deleteStatement ="delete from WIDGETS where ID = ? "; prepStmt = con.prepareStatement(deleteStatement); prepStmt.setInt(1, widgetId); prepStmt.executeUpdate(); prepStmt.close(); con.close(); } catch (Exception e) { } finally { if (prepStmt != null) { try { prepStmt.close(); } catch (Exception e) { } } } if (con != null) { try { con.close(); } catch (Exception e) { } } }
Реализация методов поиска элементов аналогична реализации предыдущих методов, за исключением что возвращается либо первичный ключ ( Integer ejbFindByPrimaryKey(Integer primaryKey) ) либо коллекция из первичных ключей ( Collection ejbFindAll() ), как и в случае с create методами.
public Integer ejbFindByPrimaryKey(Integer primaryKey) throws FinderException { boolean result; try { result = selectByPrimaryKey(primaryKey); } catch (Exception ex) { throw new EJBException("ejbFindByPrimaryKey: " + ex.getMessage()); } if (result) { return primaryKey; } else { throw new ObjectNotFoundException("Row for id " + primaryKey + " not found."); } } public Collection ejbFindAll() throws FinderException { try { Collection col = getAllElements(); return col; } catch (SQLException e) { throw new ObjectNotFoundException("Error retriving all" + "the elements in the database."); } } private boolean selectByPrimaryKey(Integer primaryKey) throws SQLException { Connection con = null; PreparedStatement prepStmt = null; boolean result = false; try { con = dataSource.getConnection(); String selectStatement = "select ID from WIDGETS where ID = ? "; prepStmt = con.prepareStatement(selectStatement); prepStmt.setInt(1, primaryKey); ResultSet rs = prepStmt.executeQuery(); result = rs.next(); prepStmt.close(); con.close(); return result; } catch (Exception e) { return result; } finally { if (prepStmt != null) { try { prepStmt.close(); } catch (Exception e) { } } if (con != null) { try { con.close(); } catch (Exception e) { } } } } private Collection getAllElements() throws SQLException { Connection con = null; PreparedStatement prepStmt = null; ArrayList list = new ArrayList(); try { con = dataSource.getConnection(); String selectStmt = "select ID " + "from WIDGETS"; prepStmt = con.prepareStatement(selectStmt); ResultSet rs = prepStmt.executeQuery(); while (rs.next()) { int id = rs.getInt(1); list.add(new Integer(id)); } return list; } catch (Exception e) { } finally { if (prepStmt != null) { try { prepStmt.close(); } catch (Exception e) { } } if (con != null) { try { con.close(); } catch (Exception e) { } } } return null; }
Осталось рассмотреть последний методы, связанные с активизацией, пассивизацией и получением контекста объектных компонентов. В методе void setEntityContext (EntityContext context) сохраняется переданный контекст объектных компонентов, а также организуется соединение с базой данных. Стоит отметить, что в методе void ejbActivate () также вызывается метод Object EntityContext.getPrimaryKey (), который восстанавливает значение первичного ключа widgetId. В методе ejbPassivate () эксперты рекомендуют обнулять первичный ключ.
public void setEntityContext(EntityContext entityContext) { this.context = entityContext; try { InitialContext ctx = new InitialContext(); if (dataSource == null) dataSource = (DataSource) ctx.lookup("java:/OracleDS"); System.out.println("Data source aquired"); } catch (NamingException ex) { throw new EJBException(ex); } } public void unsetEntityContext() { this.context = null; } public void ejbActivate() { widgetId = (Integer)context.getPrimaryKey(); } public void ejbPassivate() { widgetId = null; }