Thomas F Mutdosch
类带上了注释@Entity,以向 JPA 指示该类是一个被映射的实体。所有已命名 的查询在实体上被添加了 NamedQuery 注释。这就使您不管在应用软件中的任何 地方,都能够根据它们的查询名来参考这些查询,您不必去担心实际的 Java Persistence Query Language (JPQL)语句。 这种方法让这些查询在您的应用 软件中具有很高的可重用性。如果您想要改变已命名查询自身的话,它能使您避 免更改所有的参考。
接下来,您可以看到“deptno”已经带上了@Id注释,意味着它就是主关键字 属性。Employee 对象的列表被标上了 OneToMany 注释,以让 JPA 运行时过程知 道,该区域是由一个关系填充的。
现在让我们来看看,您的 JPA Manager Beans 是怎样与实体进行对接的。图 20 在 Page Data View 视图下,给您一个关于 JPA Manager Beans 的概述。
图 20. JPA Manager Beans
您将注意到创建,检索,更改以及删除(CRUD)操作,都已被生成 (createDepartment, deleteDepartment, updateDepartment),还有您已经指 定的所有查询方法,也已生成。Department 实体创建的每一个已命名查询,都将 会有一个与之相对应的查询方法。
列表 3 显示了 DepartmentManager 的 Java 代码。
列表 3. DepartmentManager 代码
@JPAManager(targetEntity=entities.Department.class)
@SuppressWarnings("unchecked")
public class DepartmentManager {
@PersistenceUnit
private EntityManagerFactory emf;
@Resource
private UserTransaction utx;
public DepartmentManager() {
}
@Action(Action.ACTION_TYPE.DELETE)
public String deleteDepartment(Department department) throws Exception {
EntityManager em = getEntityManager();
try {
utx.begin();
em.joinTransaction();
department = em.merge(department);
em.remove(department);
utx.commit();
} catch (Exception ex) {
try {
utx.rollback();
} catch (Exception e) {
ex.printStackTrace();
throw e;
}
throw ex;
} finally {
em.close();
}
return "";
}
@Action(Action.ACTION_TYPE.UPDATE)
public String updateDepartment(Department department) throws Exception {
EntityManager em = getEntityManager();
try {
utx.begin();
em.joinTransaction();
department = em.merge(department);
utx.commit();
} catch (Exception ex) {
try {
utx.rollback();
} catch (Exception e) {
ex.printStackTrace();
throw e;
}
throw ex;
} finally {
em.close();
}
return "";
}
@NamedQueryTarget("getDepartmentByLocation")
public List<Department> getDepartmentByLocation(String location) {
EntityManager em = getEntityManager();
List<Department> results = null;
try {
Query query = em.createNamedQuery ("getDepartmentByLocation");
query.setParame
|