翻译自 Hibernate Annotations
1. 创建POJO作为持久化实体
每个持久化POJO类都是一个实体,并使用 @Entity注解(在类级别)声明:
@Entity
public class Flight implements Serializable {Long id;@Idpublic Long getId() { return id; }public void setId(Long id) { this.id = id; }
}
@Entity将该类声明为一个实体(即一个持久的POJO类),@Id声明该实体的标识符属性。其他映射声明是隐式的。类Flight被映射到Flight表,使用列ID作为其主键列。
根据是否注释字段或方法,Hibernate使用的访问类型将为field或 property。EJB3规范要求您对将要访问的元素类型声明注释,例如,如果使用property访问权限,则使用getter方法;如果使用访问权限,则使用该字段field。应该避免在两个字段和方法中混合注释。Hibernate会从@Idor 的位置猜测访问类型@EmbeddedId。
1.1. 定义表格
@Table被设置在课堂级别; 它允许您为实体映射定义表,目录和模式名称。如果no @Table定义,则使用默认值:实体的非限定类名称。
@ Entity
@ Table (name = “tbl_sky” )
public class Sky implements Serializable { ... }
该@Table元素包含一个 schema和catalog属性,如果它们需要被定义。您还可以使用@UniqueConstraint注释连同@Table(为了绑定到单个列的唯一约束,建议使用该 @Column.unique方法(参考以@Column获取更多信息))来 为表定义唯一约束。
@ Table (name = “tbl_sky” ,uniqueConstraints = { @ UniqueConstraint (columnNames = { “month” ,“day” })} )
一个唯一的约束被应用到元组month,day。请注意该columnNames数组引用逻辑列名称。
逻辑列名由Hibernate NamingStrategy实现定义 。默认的JPA命名策略使用物理列名称作为逻辑列名,但如果您使用自定义NamingStrategy 实现将fld_附加到所有列中,它可能会有所不同。请注意,当明确设置列名称时,逻辑列名称不一定等于属性名称esp。除非你重写NamingStrategy,否则你不应该担心。
1.2. 版本控制乐观锁定
您可以使用@Version注释向实体添加乐观锁定功能 :
@Entity
public class Flight implements Serializable {
...@Version@Column(name="OPTLOCK")public Integer getVersion() { ... }
}
版本属性将被映射到 OPTLOCK列,实体管理器将使用它来检测冲突更新(防止丢失的更新,否则您可能会看到上次提交 - 赢取策略)。
版本列可以是数字(推荐的解决方案)或时间戳。Hibernate支持任何种类的类型,只要你定义并实现适当的 UserVersionType。
应用程序不得以任何方式更改由Hibernate设置的版本号。要人为增加版本号,请查看Hibernate Entity Manager的参考文档 LockModeType.OPTIMISTIC_FORCE_INCREMENT或 LockModeType.PESSIMISTIC_FORCE_INCREMENT。