2012年2月2日星期四

NetBeans_005:开发JavaEE 6 应用之五:使用EJB访问数据库

1. 右键package,选择新建,会话Bean

2. 设置会话Bean名称和位置

注意,不需要选择任何接口,这是EJB3.1的新特性。

3. 依赖注入EntityManager对象
因为EJB是线程安全的,所以这里我们使用EntityManager对象。
@PersistenceContext
EntityManager em;
public List getCustomers() {
return (List)em.createNamedQuery("Customer.findAll").getResultList();
}
现在定义一个EJB就是这样简单,无需其它描述符,无需放到特别的目录下,EJB将被打包在WAR包中。

4. 把TestServlet中的EntityManagerFactory换成EJB
(1)替换@PersistenceUnit EntityManagerFactory emf;为@EJB CustomerSessionBean bean;
(2)替换NamedQuery代码为List result = bean.getCustomers();
现在,我们通过EJB访问数据库,事务处理规则在EJB或JPA实体中设置,这是很好的一种设计模式。
运行TestServlet,效果应该和上一个实验差不多,但这次是通过EJB访问数据库得到的结果。

5. 在EJB中增加一个addCustomer方法

public void addCustomer(Integer customerId,
String name,
Address address,
String phone,
String fax,
String email,
Integer creditLimit,
DiscountCode discountCode) {
Customer c = new Customer(customerId);
c.setName(name);
c.setAddress(address);
c.setPhone(phone);
c.setFax(fax);
c.setCreditLimit(creditLimit);
c.setDiscountCode(discountCode);
em.persist(c);
}


同时在TestServlet中增加相应的处理逻辑:

String id = request.getParameter("add");
if (id != null) {
Address address = new Address();
address.setAddressline1("4220, Network Circle");
address.setCity("Santa Clara");
address.setState("CA");
MicroMarket zip = new MicroMarket();
zip.setZipCode("95051");
address.setZip(zip);
bean.addCustomer(Integer.parseInt(id),
"FLL Enterprises", address, "1234", "5678", "foo@bar.com", 1000, new DiscountCode('H'));
.....
}

6. 运行http://localhost:8080/JavaEE6SampleApp/TestServlet?add=4
可以看到增加了一个id=4的Customer对象到数据库中。

7. 测试Bean Validation特性
把Customer.java中的Phone属性的验证规则从@Size(max = 12)改为@Size(min = 7, max = 12)。
运行http://localhost:8080/JavaEE6SampleApp/TestServlet?add=5
会发现Server日志中有异常抛出:
Caused by: javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'.
Please refer to embedded ConstraintViolations for details.
这是因为现在要求Phone的长度为7到12,因此需要修改addCustomer中代码,把“1234”改成“1234567”。
再次运行http://localhost:8080/JavaEE6SampleApp/TestServlet?add=5
可以看到增加了一个id=5的Customer对象到数据库中。

没有评论: