@GeneratorValue与@GenericGenerator注解使用心得

来源:互联网 发布:手机数据清除有影响吗 编辑:程序博客网 时间:2024/06/05 14:14

转载:

什么是JAP? 

JPA全称Java Persistence API,其通过JDK 5.0(或以上版本)的注解或XML配置方式来描述 对象-关系表 的映射关系,并将运行期的实体对象持久化到数据库中。


JPA与Hibernate的关系是怎样的? 

JPA的总体思想和现有的Hibernate、TopLink、JDO等,这些ORM框架大体一致。 
个人浅显的理解为,JPA给后面那些ORM开发厂商提供了一些“标准”,使得它们可以在现有的一些模板上进行互相补充,而最后开发出来的ORM产品,主要方面还是在实体对象与数据库的持久化,以及对数据库的一些CRUD操作上。

@GeneratorValue注解 

      属于一个JPA接口(从JAVA EE 5开始,存在于javax.persistence包下),其接口下包含了两个抽象的参数,GenerationType类型的strategy和String类型的generator,并且两个参数都有相应的默认值。 

GenerationType同样也位于javax.persistence包下,并且还继承了Enum枚举类,然后其中有4个值供我们使用,分别是: 
TABLE:使用一个特定的数据库表格来保存主键。 
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)。 
IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql) 
AUTO:主键由程序控制,也是GenerationType的默认值。

下面贴出一些使用的范例。

GenerationType.TABLE
@Id  @GeneratedValue(strategy = GenerationType.TABLE, generator="payablemoney_gen")  @TableGenerator(name = "pk_gen", table="tb_generator",    pkColumnName="gen_name",  valueColumnName="gen_value",      pkColumnValue="PAYABLEMOENY_PK", allocationSize=1)  public long getUserId() {        return userId;}
GenerationType.SEQUENCE
@Id@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")@SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")public long getUserId() {        return userId;}  
GenerationType.IDENTITY
@Id@GeneratedValue(strategy = GenerationType.IDENTITY) public long getUserId() {        return userId;} 
GenerationType.AUTO
@Id@GeneratedValue(strategy = GenerationType.AUTO)public long getUserId() {        return userId;} 
四种数据库的对GeneratorValue4种策略的支持情况如下:

mysql 
GenerationType.TABLE 
GenerationType.AUTO 
GenerationType.IDENTITY 
不支持GenerationType.SEQUENCE

oracle 
strategy=GenerationType.AUTO 
GenerationType.SEQUENCE 
GenerationType.TABLE 
不支持GenerationType.IDENTITY

postgreSQL 
GenerationType.TABLE 
GenerationType.AUTO 
GenerationType.IDENTITY 
GenerationType.SEQUENCE 
都支持

kingbase 
GenerationType.TABLE 
GenerationType.SEQUENCE 
GenerationType.IDENTITY 
GenerationType.AUTO 
都支持

@GenericGenerator注解

       @GenericGenerator注解是hibernate所提供的自定义主键生成策略生成器,由@GenericGenerator实现多定义的策略。所以,它要配合@GeneratedValue一起使用,并且@GeneratedValue注解中的”generator”属性要与@GenericGenerator注解中name属性一致,strategy属性表示hibernate的主键生成策略,下面来看看hibernate的API对它的定义。 

@GenericGenerator支持13种策略,分别是:
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);  } 

上面的12种策略,再加上native,一共是13种。 
其实,这就是hibernate对JPA策略的一种拓展补充。 
我个人用的比较多的是uuid策略,用在了oracle数据库的主键生成上,她会根据内部程序计算出32位长度的唯一id,具体使用范例如下:

@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")public String getUserId() {        return userId;}
其他我就先不一一补充了,下面推荐两篇好文,里面说的很详细,很多迷惑的点我也参考了它们才解答出来,附上博文链接:

http://www.cnblogs.com/tobeprogramer/p/4162228.html

http://www.cnblogs.com/ph123/p/5692194.html

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 水管热接漏水怎么办 陶瓷浴缸下水漏水怎么办 热溶水管漏水怎么办 浴缸下水口漏水怎么办 浴缸下水器漏水怎么办 铁皮接头处漏水怎么办 马桶被堵死了怎么办 家里灯泡坏了怎么办 家里电路烧了怎么办 如果电脑开不了怎么办 热水器水管子漏水怎么办 淋浴头开关滴水怎么办 淋浴头一直滴水怎么办 饮水机放桶漏水怎么办 热水器热水阀门漏水怎么办 热水器热水出口漏水怎么办 热水器上水管漏水怎么办 水管往外漏水怎么办 ppr热水管漏水怎么办 大半夜水闸爆了怎么办 热水器不热水了怎么办 水龙头外皮裂了怎么办 电热水龙头坏了怎么办 太阳能存不住水怎么办 混水阀断裂漏水怎么办 洗澡淋浴头漏水怎么办 马桶有异物堵住怎么办 捷达机油盖漏油怎么办 乳化油臭了怎么办 自行车前叉严重生锈怎么办 自行车链条生锈了怎么办 自行车链子生锈了怎么办 对切削液过敏怎么办 齿轮油加到机油怎么办 机油加液压油里怎么办 液压油里面有水怎么办 加油站双层复合管漏油怎么办 预制屋面板底面渗漏怎么办 焊电焊眼睛疼怎么办 下水主管道篦子怎么办 墙里热水管堵了怎么办