|
Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 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;
}