Опубликован: 18.03.2010 | Уровень: специалист | Доступ: платный
Лекция 4:

Технология 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;
}
Антон Зубеков
Антон Зубеков

Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений"

Ярославй Грива
Ярославй Грива
Россия, г. Санкт-Петербург
Ольга Малых
Ольга Малых
Россия, Казань, Университет управления "ТИСБИ"