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.DATEjava.sql.Date日期型,精确到年月日2015-02-16
TemporalType.TIMEjava.sql.Time时间型,精确到时分秒10:44:00
TemporalType.TIMESTAMPjava.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
赞助本站,网站的持续发展离不开你们的支持!一分也是爱ヾ(◍°∇°◍)ノ゙
 本文链接: ,花了好多脑细胞写的,转载请注明链接喔~~
登陆
      正在加载评论