@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
阅读全文
0 0
- @GeneratorValue与@GenericGenerator注解使用心得
- @GeneratorValue与@GenericGenerator注解使用心得
- @GeneratedValue 与 @GenericGenerator
- @GeneratedValue 与 @GenericGenerator
- @GeneratedValue 与 @GenericGenerator
- @GeneratedValue 与 @GenericGenerator
- @GeneratedValue 与 @GenericGenerator
- @GeneratedValue 与 @GenericGenerator
- hibernate中的@GeneratedValue与@GenericGenerator
- 解密Hibernate @GenericGenerator注解中的strategy属性
- @GeneratedValue 与 @GenericGenerator 主键生成策略
- hibernate主键生成策略 @GeneratedValue 与 @GenericGenerator
- 自定义注解与使用
- TinyMce介绍与使用心得
- DB2使用技巧与心得
- JFreeChart使用心得与例子
- JFreeChart使用心得与例子
- JFreeChart使用心得与例子
- win7系统python安装
- java.io.IOException: Cannot run program "/opt/java/sdk/build-tools/23.0.1/aapt": error=2, No such fi
- Git 最基本的操作命令
- 习题8.2
- Android fragment与Activity交互
- @GeneratorValue与@GenericGenerator注解使用心得
- 字符串全排列
- 脱壳解壳android安全
- random模块
- 解决 ajax报错406,springMVC报错406,页面报错406解决办法
- java 搭建基于springboot的ssm(spring + springmvc + mybatis)的maven项目
- 语谱图 基频 共振峰
- 第一篇博客
- 诸葛亮出山前也没有带过兵啊,凭什么要求我有工作经验?