生成主键
Hibernate 能够地自动生成主键。Hibernate/EBJ 3 注释也可以ؓ主键的自动生成提供丰富的支持Q允许实现各U策略。下面的CZ说明了一U常用的ҎQ其?Hibernate 会Ҏ底层数据库来定一U恰当的键生成策略:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId() {
return id;
}
定制表和字段映射
默认情况下,Hibernate 会将持久cM匚w的名U映到表和字段中。例如,前一个类可以与映到以如下代码创建的表中Q?/font>
CREATE TABLE MODELPLANE
(
ID long,
NAME varchar
)
如果您是自己生成q维护数据库Q那么这U方法很有效Q通过省略代码可以大大化代码维护。然而,qƈ不能满所有h的需求。有些应用程序需要访问外部数据库Q而另一些可能需要遵从公司的数据库命名惯例。如果有必要Q您可以使用 @Table ?@Column 注释来定制您自己的持久性映,如下所C:
@Entity
@Table(name="T_MODEL_PLANE")
public class ModelPlane {
private Long id;
private String name;
@Id
@Column(name="PLANE_ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="PLANE_NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
该内容将映射C表中Q?br />
CREATE TABLE T_MODEL_PLANE
(
PLANE_ID long,
PLANE_NAME varchar
)
也可以用其他图和列的属性来定制映射。这使您可以指定诸如列长度、非I约束等详细内容。Hibernate支持大量针对q些注释的属性。下例中包含了几种属性:
...
@Column(name="PLANE_ID", length=80, nullable=true)
public String getName() {
return name;
}
...
映射关系
Java 持久性映过E中最重要和最复杂的一环就是确定如何映表间的关系。像其他产品一P Hibernate 在该领域中提供了高度的灵zL,但却是以复杂度的增加Z仗我们将通过研究几个常见案例来了解如何用注释来处理q一问题?br />
其中一U最常用的关pd是多对一的关pR假定在以上CZ中每?ModelPlane 通过多对一的关p(也就是说Q每个飞机模型只与一U飞机类型徏立联p,管指定的飞机类型可以与七种飞机模型建立联系Q来?PlaneType 建立联系。可如下q行映射Q?br />
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
public PlaneType getPlaneType() {
return planeType;
}
CascadeType D?Hibernate 应如何处理联操作?br />
另一U常用的关系与上q关pȝ反:一对多再对一关系Q也UCؓ集合。在老式?Hibernate 版本中进行映或使用注释Ӟ集合令h头疼Q这里我们将要加以探讨,以您了解如何处理集合,例如Q在以上CZ中每?PlaneType 对象都可能会包含一?ModelPlanes 集合。可映射如下Q?br />
@OneToMany(mappedBy="planeType",
cascade=CascadeType.ALL,
fetch=FetchType.EAGER)
@OrderBy("name")
public List<ModelPlane> getModelPlanes() {
return modelPlanes;
}
命名查询
Hibernate 最优秀的功能之一在于它能够在您的映文件中声明命名查询。随后即可通过代码中的名称调用此类查询Q这使您可以专注于查询,而避免了 SQL 或?HQL 代码分散于整个应用程序中的情c?br />
也可以用注释来实现命名查询Q可以?@NamedQueries ?@NamedQuery 注释Q如下所C:
@NamedQueries(
{
@NamedQuery(
name="planeType.findById",
query="select p from PlaneType p left join fetch p.modelPlanes where id=:id"
),
@NamedQuery(
name="planeType.findAll",
query="select p from PlaneType p"
),
@NamedQuery(
name="planeType.delete",
query="delete from PlaneType where id=:id"
)
}
)
一旦完成了定义Q您可以像调用其他M其他命名查询一h调用它们?br />
l束?br />
Hibernate 3 注释提供了强大而精致的 APIQ简化了 Java 数据库中的持久性代码,本文中只q行了简单的讨论。您可以选择遵从标准q?Java 持久?APIQ也可以利用特定?Hibernate的扩展,q些功能以损失可UL性ؓ代h提供了更为强大的功能和更高的灉|性。无论如何,通过消除?XML 映射文g的需求,Hibernate 注释简化应用程序的l护Q同时也可以使您对EJB 3 有初步认识。来试试吧!