沉睡森林@漂在北京
本处文章除注明“转载”外均为原创,转载请注明出处。
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
152 随笔 :: 4 文章 :: 114 评论 :: 0 Trackbacks
<
2010年3月
>
日
一
二
三
四
五
六
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
随笔分类
(115)
DataBase(15)
(rss)
Digester(4)
(rss)
Eclipse(1)
(rss)
Ext(29)
(rss)
jQuery(7)
(rss)
Other(28)
(rss)
Spring(19)
(rss)
Ubuntu(6)
(rss)
WebService(2)
(rss)
Workflow(4)
(rss)
随笔档案
(154)
2012年6月 (1)
2012年4月 (5)
2012年3月 (3)
2010年7月 (1)
2010年6月 (6)
2010年5月 (4)
2010年4月 (2)
2010年3月 (13)
2010年2月 (3)
2010年1月 (16)
2009年12月 (1)
2009年11月 (3)
2009年10月 (3)
2009年9月 (2)
2009年8月 (3)
2009年7月 (4)
2009年6月 (10)
2009年5月 (15)
2009年4月 (3)
2009年3月 (12)
2009年2月 (6)
2008年12月 (6)
2008年11月 (11)
2008年10月 (21)
技术blog
B/S开发
Cat in dotNET
java&maven2
JAVA之道
OOPAA
Ruby's Louvre
xmatthew
万事大吉的IT学习笔记
从嘉陵到钱塘
开发者的最佳实践
成吉的个人网站
薛敬明的专栏
ext方面很多实用的文章
搜索
最新评论
1. re: 利用axis2的wsdl2java生成webservice的客户端代码[未登录]
1
--1
2. re: SpringMVC下的权限控制
45
--sad
3. re: SpringMVC下的权限控制
发的更好地发挥到发货
--才不会
4. re: 关于oracle中varchar2的最大长度
你太给力了!果断顶起!!
--荒漠依米
5. re: 关于oracle中varchar2的最大长度
afa
--sdf
基于按annotation的hibernate主键生成策略
自定义主键生成策略,由@GenericGenerator实现。
hibernate在JPA的基础上进行了扩展,可以用一下方式引入hibernate独有的主键生成策略,就是通过@GenericGenerator加入的。
比如说,JPA标准用法
Java代码
@Id
@GeneratedValue(GenerationType.AUTO)
就可以用hibernate特有以下用法来实现
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "assigned")
@GenericGenerator的定义:
Java代码
@Target({PACKAGE, TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface GenericGenerator {
String name();
String strategy();
Parameter[] parameters() default {};
}
name属性指定生成器名称。
strategy属性指定具体生成器的类名。
parameters得到strategy指定的具体生成器所用到的参数。
对于这些hibernate主键生成策略和各自的具体生成器之间的关系,在org.hibernate.id.IdentifierGeneratorFactory中指定了,
Java代码
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,hibernate一共默认支持十三种生成策略。
1、native
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "native")
2、uuid
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
3、hilo
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "hilo")
4、assigned
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "assigned")
5、identity
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "identity")
6、select
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name="select", strategy="select",
parameters = { @Parameter(name = "key", value = "idstoerung") })
7、sequence
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "sequence",
parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })
8、seqhilo
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo",
parameters = { @Parameter(name = "max_lo", value = "5") })
9、increment
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "increment")
10、foreign
Java代码
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "foreign",
parameters = { @Parameter(name = "property", value = "employee") })
注意:直接使用@PrimaryKeyJoinColumn 报错(?)
Java代码
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
例如
Java代码
@Entity
public class Employee {
@Id Integer id;
@OneToOne @PrimaryKeyJoinColumn
EmployeeInfo info;
}
应该为
Java代码
@Entity
public class Employee {
@Id
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "foreign",
parameters = { @Parameter(name = "property", value = "info") })
Integer id;
@OneToOne
EmployeeInfo info;
}
11、guid
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "guid")
12、uuid.hex
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid.hex")
13、sequence-identity
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity",
parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })
四、通过@GenericGenerator自定义主键生成策略
如果实际应用中,主键策略为程序指定了就用程序指定的主键(assigned),没有指定就从sequence中取。
明显上面所讨论的策略都不满足,只好自己扩展了,集成assigned和sequence两种策略。
Java代码
public class AssignedSequenceGenerator extends SequenceGenerator implements
PersistentIdentifierGenerator, Configurable {
private String entityName;
public void configure(Type type, Properties params, Dialect dialect) throws MappingException {
entityName = params.getProperty(ENTITY_NAME);
if (entityName==null) {
throw new MappingException("no entity name");
}
super.configure(type, params, dialect);
}
public Serializable generate(SessionImplementor session, Object obj)
throws HibernateException {
Serializable id = session.getEntityPersister( entityName, obj )
.getIdentifier( obj, session.getEntityMode() );
if (id==null) {
id = super.generate(session, obj);
}
return id;
}
}
实际应用中,定义同sequence。
Java代码
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "AssignedSequenceGenerator",
parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })
值得注意的是,定义的这种策略,就像打开了潘多拉魔盒,非常不可控。正常情况下,不建议这么做。
posted on 2010-03-15 21:50
王总兵
阅读(646)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
Powered by:
BlogJava
Copyright © 王总兵