使用EJB3 Java 持久化API
【IT168 技术文档】
嵌入对象
一个嵌入对象是一个自己不具有id的持久化对象。它是另外一个实体的一部分。例如,我们可以假定Address对象没有自己的id,并且它作为Employee实体的一部分进行存储。因此,Address是一个嵌入对象。
你可以采用如下的方法来创建一个嵌入对象
@Embeddable
public class Address {
protected String streetAddr1;
protected String streetAddr2;
protected String city;
protected String state;
..
}
下面是如何将一个对象嵌入到一个目标对象中
@Entity
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
protected Long id;
...
@Embedded
protected Address address;
...
}
关系
在一个典型的领域模型中,实体可能互相联系或者存在一定的关系。两个实体之间的关系可能是一对一(one-to-one),一对多(one-to-many),多对一(many-to-one),多对多(many-to-many)。实体之间的这些关系可以分别使用OneToOne, OneToMany, ManyToOne, or ManyToMany标注来描述。我们的示例在Department和Employee实体上采用了双向的OneToMany关系。
既然我们在实体中使用了基于字段的访问,那么我们就在Department实体的关系字段上使用标注,如下:
@OneToMany(mappedBy="department")
protected Collection<Employee> employees ;
对于一个双向的关系来说,你必须指定mappedBy元素,就像上面那样,通过指明拥有这个关系的字段名或者属性名来指出反向的关系如何进行映射。
标准化O-R 映射
你可以使用Java标注或者XML来进行实体的O-R映射的定义。EJB3 JPA定义了几个标注来进行O-R映射,例如Table,SecondaryTable, Column, JoinColumn, 以及 PrimaryKeyJoinColumn等标注。参考EJB3 JPA规范来获取所有标注的信息。
在我们的例子中,你可以使用Table标注来定义该实体应该映射到那个表中,例如:
@Table(name="DEPT")
public class Department implements Serializable {
EJB3 JPA中,各种映射都普遍具有默认值。如果你不定义表映射的话,持久化提供者会假定这个实体将要映射到和实体类类名同名的表中(在这个例子中就是Deparment表)。如果你的实体需要映射到多个表中,你可以使用SecondaryTable标注。
你可以使用Column标注将一个字段或者属性映射到数据库中的一个字段,就像下面这样:
@Column(name="DNAME")
protected String name;
这里,DNAME是需要持久化的字段name要映射的数据库中的字段名。如果你不使用Column定义字段的映射的话,持久化引擎会尝试使用与字段名或者属性名相同的数据库字段名来进行持久化。