1.@Entity
位于类名前;
指出该Java类为实体类,并且将映射到指定的数据库表;
比如:Emp类前名加上该注解后,就可以和配置的数据库中的emp表相互映射了;
2.@Table
位于类名前
当实体类名和映射的表名不一致时,需要加上该注解;
name属性 ->用于指定数据库的表名;
catalog 和 schema 属性 ->用于设置表所属的数据库目录或模式,通常为数据库名;
uniqueConstraints ->用于设置约束条件,通常不设置;
该注解最主要的用法是,用name属性来指定表名;
3.@Id
位于属性声明前;或get方法前;
用于声明该属性映射的是表中的主键;
4.@GeneratedValue
位于主键属性前;
用于标注属性的生成策略;通过strategy属性来指定;
默认自动选择一个最适合的生成策略;mysql是auto increment;sqlserver是identity;
在javax.persistence.GenerationType中定义了几种主键生成策略:
IDENTITY ->数据库id自增长的方式来增加主键字段;oracle不支持;
AUTO ->自动选择,默认;
SEQUENCE ->通过序列产生主键,通过@SequenceGenerator注解指定序列名,mysql不支持;
TABLE ->通过表产生主键;框架借由表模拟序列产生主键,使用该策略可以使应用更容易数据库移植;
5.@Basic
用于属性到表字段的映射;
如果get方法前没加注解默认是该注解;
fetch属性 ->表示该属性的读取策略;EAGER表示主支抓取;LAZY表示延迟加载;
optional ->表示该属性是否允许为空;默认true;
6.@Column
位于属性前;或get方法前;
通常用于属性名与映射的表列名不同时;
name属性可以指定表名;
还有unique、nullable、length等属性指定表列的属性;
columnDefinition属性表示该属性在表字段中的实际类型;例如String对应varchar;
7.@Transient
如果属性不指定注解,会默认为@Basic;
但是,有些属性不需要映射到数据库表中;
该注解的作用就是忽略不需要映射的属性;
8.@Temporal
用来指定时间格式;
默认实体类中的Date类型的属性映射到表中是 datetime;
该注解可以指定Date的映射类型;比如数据库表中,生日的日期不需要精确到时分秒用date就够了;
有三种日期格式可选:DATE、TIME、TIMESTAMP;
9.用table来指定主键生成策略
主要思路:
将当前主键的值单独保存到一个数据库表中;
主键的值通过查表得到;
优点:
这种主键生成策略可适用到任何数据库,避免了数据库不兼容;
1)创建一张主键生成器表
2)在主键生成器表中插入一条数据
3)在主键前加上注解
@GeneratedValue 设置主键生成策略为TABLE;
@TableGenerator 注解设定该实体类的主键与数据库主键生成器表之间的关系;
name属性 ->表示主键生成策略的名称;与@GeneratedValue中的generator属性相对应;
table ->表示数据库中主键生成器表的表名;
allocationSize ->每次主键增加的大小,默认50;
pkColumnName ->数据库中主键生成器表主键名的列名;
pkColumnValue ->主键使用的生成器的名字;
valueColumnName ->主键生成器表主键值的列名;
具体操作:
在实体类的主键id前面,将@GeneratedValue的生成策略改为TABLE,并用generator属性指定一个生成器名;
添加@TableGenerator注解,name属性对应前面的generator;按照数据库中生成器表来指定各种属性;
@Column(name="id")
@TableGenerator(
name="emp_generator",
allocationSize=10,
pkColumnName="pk_name",
pkColumnValue="emp_pk",
valueColumnName="pk_value"
)
@GeneratedValue(strategy=GenerationType.TABLE,generator="emp_generator")
@Id
private Integer id;
4)执行main方法,插入三条数据来测试
如果主键生成策略修改成功,则每次主键自增10;
结果如图: