使用EJB3 Java 持久化API
【IT168 技术文档】
元数据标注
Java SE 5.0 引入了元数据标注。Java EE的所有组件,包括 EJB3 JPA,都大量使用了元数据标注来简化企业Java应用的开发。想要了解更多的元数据标注方面的知识,请参阅Kyle Downey 写的Bridging the Gap: J2SE 5.0 Annotations文章。在EJB3 JPA中,元数据可以用来定义对象,关系,O-R映射以及持久化上下文(Context)的注入。JPA同样提供了使用XML描述符来提供持久化元数据的方法。而笔者则会重点讲述使用标注的方式,因为这使得开发变得更加简单。但是,在产品部署阶段,你或许会倾向于使用XML描述符,你可以使用XML描述符来覆盖标注定义的持久化行为。
在JPA中将O-R映射标准化
定义持久化对象:实体
一个实体是一个轻量级的领域对象――一个需要持久化到关系数据库中的POJO。与其他的POJO一样,一个实体可以是抽象类或者具体类,而且它可以从其他POJO扩展得到。可以使用javax.persistence.Entity标注将一个POJO标注成一个实体
下面是如何将领域模型中的Department对象变成一个实体的例子:
package onjava;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
@Entity
@NamedQuery(name="findAllDepartment", query="select o from Department o")
@Table(name="DEPT")
public class Department implements Serializable {
@Id
@Column(nullable=false)
protected Long deptNo;
@Column(name="DNAME")
protected String name;
@Column(name="LOC")
protected String location;
@OneToMany(mappedBy="department")
protected Collection<Employee> employees;
public Department() {
}
...
public Collection<Employee> getEmployees() {
return employees;
}
public void setEmployees(Collection<Employee> employees) {
this.employees = employees;
}
public Employee addEmployee(Employee employee) {
getEmployees().add(employee);
employee.setDepartment(this);
return employee;
}
public Employee removeEmployee(Employee employee) {
getEmployees().remove(employee);
employee.setDepartment(null);
return employee;
}
}
每一个实体都有一个主键;可以在一个持久化字段(field)或者属性上使用Id标注来将它作为一个主键。一个实体可以通过使用字段或者属性(通过 setter and getter 方法)来维护自己的状态。这取决于你在何处使用Id标注。上面的例子中采用了基于字段的访问,我们在deptNo字段上使用了Id标注。如果要使用基于属性的访问,你需要在属性上使用Id这样的标注。
@Id
public Long getDeptNo() {
return deptNo;
}
public void setDeptNo(Long deptNo) {
this.deptNo = deptNo;
}
必须注意,在一个实体继承体系中的所有实体,都必须使用通用的访问类型,或者都使用字段,或者都使用属性。
一个实体中定义的所有字段,默认情况下,都会进行持久化。如果你不想存储某个字段(或者属性),你必须将字段(或者属性)定义成临时的,通过采用@Transient标注或者采用transient修饰符。