JPA Java Persistence API,是Java EE 5的标准ORM接口,也是ejb3规范的一部分。Hibernate是对JPA的一个实现。
一、@Column
@Column
注解一共有10个属性,均为可选,下面是对各属性的详细解释:
(1)name
定义了被标注字段在数据库表中所对应字段的名称,可以标注在属性名上或是getter方法上,假如不标注,默认和属性名相同。
(2)unique
表示该字段是否为唯一标识,默认为false。
(3)nullable
表示该字段是否可以被设置为null值,默认为true。
(4)insertable和updatable
表示在使用“insert”语句插入数据或是用“update”更新数据时,是否需要插入/更新该字段的值,也可以说是设置该字段为只读,通常用于主键和外键,因为这些字段的值通常是自动生成的。
(5)columnDefinition
表示创建表时,该字段创建的SQL语句,一般用于自定义字段的类型。例如要存储富文本时,会有大量的HTML标签,而Mysql中varchar最大是65532(还有第一个字节+两个长度字节)字节,oracle中varchar2的最大长度是4000字节,很明显有可能会超出范围,这时候使用@Column(name="content",columnDefinition="clob not null")
将文本内容设置成clob类型,容量就大大增加了。
(6)table
表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。
(7)length
表示字段的长度,当字段的类型为varchar(就是String默认对应的类型)时,才有效,默认为255个字节。
(8)precision和scale
两者表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
二、@Temporal
主要是控制Date类型存储时候的格式
格式@Temporal(value)
,下面是value可选值
类型 | 对应类型 | 说明 | 精度举例 |
TemporalType.DATE | java.sql.Date | 日期型,精确到年月日 | 2015-02-16 |
TemporalType.TIME | java.sql.Time | 时间型,精确到时分秒 | 10:44:00 |
TemporalType.TIMESTAMP | java.sql.Timestamp | 时间戳,精确到纳秒 | 2015-02-16 10:44:00.000000001 |
三、ID生成
@Id
标识主键
@GeneratedValue
选择主键生成规则
@GenericGenerato
规则扩展
(1)@GeneratedValue
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制(也是默认的,在指定主键时,如果不指定主键生成策略,默认为AUTO)
(2)@GenericGenerato
格式:
@Id @GeneratedValue(generator = "userGuid") @GenericGenerator(name = "userGuid", strategy = "guid")
name:指定生成器名称
strategy:指定具体生成器的类名
各种生成规则在org.hibernate.id.IdentifierGeneratorFactory中:
static { GENERATORS.put("uuid", UUIDHexGenerator.class); GENERATORS.put("hilo", TableHiLoGenerator.class); GENERATORS.put("assigned", Assigned.class); GENERATORS.put("identity", IdentityGenerator.class); GENERATORS.put("select", SelectGenerator.class); GENERATORS.put("sequence", SequenceGenerator.class); GENERATORS.put("seqhilo", SequenceHiLoGenerator.class); GENERATORS.put("increment", IncrementGenerator.class); GENERATORS.put("foreign", ForeignGenerator.class); GENERATORS.put("guid", GUIDGenerator.class); GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class); }
类型 | 说明 |
native | 对于orcale采用Sequence方式,对于MySQL和SQL Server采用identity(处境主键生成机制),native就是将主键的生成工作交给数据库本身,使用数据库本地的策略 |
uuid | 采用128位的uuid算法生成主键,结果为一个32位16进制数字的字符串 |
hilo | 要在数据库中建立一张额外的hibernate_unque_key表,默认字段为integer类型,名称是next_hi |
assigned | 在插入数据的时候主键由程序处理,这是默认策略,相当于AUTO |
identity | 使用数据库的自增字段(Oracle不支持自增字段),要设定sequence(MySQL和SQL Server中很常用)。相当于IDENTITY |
select | 使用触发器生成主键 |
sequence | 调用谨慎数据库的序列来生成主键,要设定序列名,不然hibernate无法找到 |
seqhilo | 通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence的数据库 |
increment | 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法 |
foreign | 使用其它表的主键 |
guid | 采用数据库底层的guid算法机制 |
uuid.hex | 已不推荐使用 |
sequence-identity |