使用EJB3 Java 持久化API
【IT168 技术文档】
实体继承
EJB3 JPA 采用多种方法来支持实体继承。它需要两种类型的继承表映射策略:Single-table-per-entity 继承层次策略和Joined-Subclass策略。最好避免使用可选的table-per-class层次。
single-table-per-entity 继承层次策略允许一个继承层次中的所有实体都映射到单一的表中。在我们的示例中,FullTime和Contractor都继承了Employee,所有它们的示例都会被映射到一个叫做EMP的表中。换句话说,所有与Employee,FullTime和Contractor相关的数据都会被存储到同一个表中。
如果你使用Joined-Subclass策略,你可以将通用的数据映射到超类(例如Employee)表中,同时为每个子类定义一个表来存储子类特有的数据。
必须在超类上使用Inheritance标注来指明采用的继承映射策略,就像下面的代码那样。这个例子演示了实体继承层次使用single-table-per-entity策略的方法。
@Entity
@Table(name="EMP")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="EMPLOYEE_TYPE",
discriminatorType=DiscriminatorType.STRING, length=1)
public abstract class Employee implements Serializable {
...
}
每个子类必须指明用于区分实体类型的值,如下所示:
@Entity
@DiscriminatorValue(value="F")
public class FullTime extends Employee {
@Column(name="SAL")
protected Double salary;
@Column(name="COMM")
protected Double commission;
@Column(name="DESIG")
protected String designation;
...
}
Entity Manager API:实体操作的标准API
javax.persistence.EntityManager 用来管理实体的声明周期,它提供了几个方法来进行实体的CRUD操作。
EntityManager API 在一个事务上下文(transaction context)中被调用。你可以从EJB容器以外来调用它,例如,你可以从一个Web应用中来调用,使用EntityManager API并不一定需要一个sesssion bean门面(facade).
在你进行实体操作之前,你必须获取一个EntityManager的实例。你可以使用容器管理的实体管理器,也可以使用应用程序管理的实体管理器,同时你可以使用JNDI查询或者依赖注射来获取EntityManager得实例。顾名思义,在容器管理的Entity Manager的情况下,Java EE容器管理Entity Manager的生命周期。这通常在企业Java应用中使用。
你可以使用PersistenceContext标注来进行依赖注射而获取一个容器管理的entity manager的实例,如下:
@PersistenceContext(unitName="onjava")
private EntityManager em;
如果你想要使用应用程序管理的entity manager,你必须自己管理它的声明周期。你可以使用如下方法创建它的一个实例。
@PersistenceUnit(unitName="onjava")
private EntityManagerFactory emf;
private EntityManager em = emf.createEntityManager();
然后,就可以使用EntityManager实例来进行实体的CRUD操作了。为了关闭应用程序管理的entity manager的实例,在进行完操作以后调用em.close()方法。