PO=POJO+注解
修饰PO类
被@Entity修饰的持久化类的所有属性都会被映射到底层数据表
@Entity:可指定一个name属性(为该实体类的名称)
@Table:指定持久化类所映射的表,属性:
name:设置持久化类所映射表的表名。无指定,则和持久化类名相同
@UniqueConstraint:用于为数据表定义唯一约束,属性:
columnNames:一个字符串数组,每个字符串元素代表一个数据列
@Index:为数据表定义索引
@Proxy:注解的proxyClass属性指定一个接口,在延迟加载时作为代理使用
@DynamicInsert:指定用于插入记录的insert语句是否在运行时动态生成
@DynamicUpdate:指定用于更新记录的update语句是否在运行时动态生成
@SelectBeforeUpdate:在更新某个持久化对象之前是否需要进行一次查询
@Where:clause属性可指定一个附加的SQL语句过滤条件(类似于添加Where语句)
映射属性
@Column:指定数据列的详细信息(列名、列字段长度等)
length
name:该列列名。默认与修饰的成员变量名相同
nullable:指定该列是否允许为null。默认:true
table:指定该列所属的表名。当需要用多个表保存一个实体,需要指定该属性
@Access:用于单独改变Hibernate对该属性的访问策略
@Formula(公式、准则):value属性可指定一个SQL表达式,指定该属性的值将根据表达式来计算,该属性值是动态计算出来的,无需保存到数据库
@Formula("(select concat(nt.title,nt.content) from news_inf nt where nt.id=id)")
@Generated:设置该属性映射的数据列的值是否由数据库生成,
value属性:
GenerationTime.NEVER、(不由数据库生成)
GenerationTime.INSERT(在执行insert语句时执行)、
GenerationTime.ALWAYS(insert和update都会被重新生成)
@Transient(短暂的,临时的)修饰不想持久保存的属性,不会被映射到数据列中
@Enumerated修饰枚举属性
value属性:EnumType.STRING时,底层数据库保存枚举值的名称
EnumType.ORDINAL时,底层数据库保存枚举值的序号
@Lob、@Basic修饰大数据类型属性
@Basic属性:
fetch:指定是否延迟加载该属性。FetchType.EAGER(立即加载)、FetchType.LAZY(延迟加载)
optional:指定该属性映射的数据列是否允许使用null值
@Temporal(时间的)修饰日期类型的属性
属性:
TemporalType.DATE、TemporalType.TIME、TemporalType.TIMESTAMP
映射主键
Hibernate建议持久化类定义一个标识属性,用于唯一地标识某个持久化实例,而标识属性则需要映射到底层数据表的主键
数据库建模理论推荐使用逻辑主键,逻辑主键没有实际意义,仅仅用来标识一行记录,Hibernate提供了主键生成器,它负责为每个持久化实例生成唯一的逻辑主键值
注解修饰
1、@Id注解无需指定任何属性:标识属性为基本数据类型、包装类、String、Date等
2、@GeneratedValue修饰实体的标识属性:逻辑主键自动生成主键值
strategy:指定Hibernate对该主键列使用怎样的主键生成策略:
GenerationType.AUTO(默认值)、
GenerationType.IDENTITY(MySQL,SQL Server)、
Generation.SEQUENCE(Oracle)、
GenerationType.Table(使用辅助表来生成主键,与@TableGenerator一起使用)generator:该属性引用@SequenceGenerator、@TableGenerator所定义的生成器的名称
使用SEQUENCE、TABLE主键生成策略,还需结合@SequenceGenerator、@TableGenerator
@TableGenerator支持的属性:
name:主键生成器名称
table:辅助表的表名
pkColumnName:指定存放主键名的列名
pkColumnValue:指定主键名
valueColumnName:指定存放主键值的列名
···
例:
import javax.persistence.*;
@Entity
@Table(name="news7_inf")
public class News {
@Id
@TableGenerator(name="newsGen", table="NEWS_ID_GEN",//表名
pkColumnName="gen_key",valueColumnName="gen_value",//主键名、值的列名
pkColumnValue="news_id")
@GeneratedValue(strategy=GenerationType.TABLE,generator="newsGen")
private Integer id;
@Column(name="news_title",length=50)
private String title;
public void setTitle(String title){
this.title=title;
}
public String getTitle(){
return title;
}
}