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

Технология Enterprise Java Beans. Часть 2

Класс компонента

В классе компонента придется вручную реализовывать все заявленные выше методы, а также методы ejbLoad (), ejbStore (), ejbRemove (), ejbActivate () и ejbPassivate().

Класс объектного компонента должен имплементировать (implement) интерфейс EntityBean.

public class WidgetBean implements EntityBean

Начнем с самого простого - set и get методов. Их реализация приводится ниже. Могло бы показаться несколько странным, что в этих методах отсутствуют какие-либо механизмы взаимодействия с базой данных. Все взаимодействия с базой данных по поддержанию постоянства компонента описываются в методах ejbLoad() и ejbStore().

private Integer widgetId;
private String description;
private double price;
private EntityContext context;
public Integer getId()   
{
return widgetId;
}
public String getDescription()   
{
return description;
}
public double getPrice()   
{ 
return price;
}

public void setDescription(String description)   
{ 
this.description = description;
}
public void setPrice(double price)   
{ 
this. price = price;
}

В методах ejbLoad() и ejbStore() вызываются private методы компонента loadRow() и storeRow(). Метод loadRow () по widgetId загружает из базы данных цену и описание, а метод storeRow() выполняет сохранение этих полей в базе данных. Работа с базой данных аналогична работе с базой данных из примера с интернет магазином. В начате метода ejbLoad() выполняется следующая инструкция -

widgetId = (Integer) context.getPrimaryKey();

Метод loadRow() использует widgetId для того, чтобы загрузить запись из базы данных.

Но в некоторых случаях widgetId может быть недоступно (эксперты говорят, что для некоторых производителей контейнеров ejb это случается, если был сделан запрос поиска по первичному ключу посредством метода Integer ejbFindByPrimaryKey (Integer) (см. далее), и компонент в этот момент был активизирован). Для этого вызывается метод Object getPrimaryKey () класса EntityContext. Через контекст первичный ключ доступен всегда. Возможно это обуславливается особенностями некоторых контейнеров EJB.Так или иначе, эксперты гарантируют, что если получать первичный ключ в методе ejbLoad() и методе ejbActivate(), то проблем возникнуть не должно. Что ж, доверимся их мнению.

public void ejbLoad()   
{
widgetId =  (Integer)   context.getPrimaryKey();
try 
	{
	loadRow();
	}   
catch   (Exception ex)   
	{
	throw new EJBException("ejbLoad:   " + ex.getMessage());
	}
}

public void ejbStore()   
{
try 
	{
	storeRow();
	}   
catch   (Exception ex)   
	{
	throw new EJBException("ejbLoad:   " + ex.getMessage());
	}
}
private void loadRow()   throws SQLException  
	{ 
	Connection con = null; 
	PreparedStatement prepStmt = null;
	try 
		{
		con = dataSource.getConnection(); 
		String selectStatement ="select DESCRIPTION, PRICE " +
		"from WIDGETS where ID = ?  ";
		prepStmt = con.prepareStatement(selectStatement); 
		prepStmt.setInt(1,  widgetId); 
		ResultSet rs = prepStmt.executeQuery();
		if   (rs.next())   
			{
			this.description = rs.getString(1); 
			this.price = rs.getDouble(2); 
			prepStmt.close();
			}
		else  
			{
			prepStmt.close();
			throw new NoSuchEntityException("Row for widgetId " + widgetId + " not found in database.");
			}
		con.close();
		}   
	catch   (Exception e)   
		{
		} 
	finally 
		{
		if   (prepStmt   != null)   
			{
			try 
			{
			prepStmt.close(); 
			}   
			catch   (Exception e)
			{
			}
			}
		if   (con   != null)   
			{
			try 
			{
			con.close();
			}   
			catch   (Exception e)
			{
			}
			}
		}
	}

private void storeRow()   throws SQLException  
	{ 
	Connection con = null; 
	PreparedStatement prepStmt = null;
	try 
		{
		con = dataSource.getConnection(); 
		String updateStatement = "update WIDGETS set DESCRIPTION =   ? , 
			" + "PRICE = ? " + "where ID = ?";
		prepStmt = con.prepareStatement(updateStatement);
		prepStmt.setString(1,  description); 
		prepStmt.setDouble(2,  price); 
		prepStmt.setInt(3,  widgetId);
		int rowCount = prepStmt.executeUpdate();
		prepStmt.close();
		con.close();
		
		if   (rowCount == 0)   
			{
			throw new EJBException("Storing row for widgetId " + widgetId + " failed.");
			}
		}   
	catch   (Exception e)   
		{
		} 
	finally 
		{
		if (prepStmt != null) 
			{
			try 
			{
			prepStmt.close(); 
			}   
			catch   (Exception e)   
			{
			}
		}
		if   (con   != null)   
			{
			try 
			{
			con.close();
			}   
			catch   (Exception e)   
			{
			}
			}
		}
	}
Антон Зубеков
Антон Зубеков

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

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