您的位置:首页 > 其它

ID的生成策略(hibernate的id生成策略,主键类为什么需要实现序列化接口,同时还要重写hashCode()和equals()方法)

2014-07-13 10:41 633 查看
在数据库中,通常主键都有自动增长功能。如:mysql中用auto_increment oracle中用sequence,sql server中用identity。hibernate在生成数据库表时,如何让其主键具有自动增长呢??

一.单主键(只有一个属性作为主键):
1.xml方式:
generator,常用4个:uuid(全球唯一) native(跨数据库平台) identity(sql server) sequence(oracle),帮助文档有详细的说明。
<id name="id" column="id">

<generator class="native"></generator>

</id>
2.annotation:使用注解
@GeneratedValue 默认为auto(相当于native)
Identity
Sequence
Table
/*@TableGenerator(

name="teaDb", //tableGenerator名字

table="ID_GEN", //表名

pkColumnName="pk_key", //生成表的主键

valueColumnName="pk_value", //生成表的值

pkColumnValue="teacher", //记录的key值

allocationSize=1//增长的步长,当取完一次值后,然后自动加上几

)*/
@TableGenerator(

name="empGen",

table="ID_GEN",

pkColumnName="GEN_KEY",

valueColumnName="GEN_VALUE",

pkColumnValue="EMP_ID",

initialValue=1,

allocationSize=1)

@SequenceGenerator(name="teacherSEQ",sequenceName="teaSeq_Db")//指定sequence生成器的名字

二.联合主键:
1.xml方式:使用composite-id。如:
<composite-id name="pk" class="StudentPk">

<key-property name="id"></key-property>

<key-property name="name"></key-property>

</composite-id>
2.annotation方式:

1.主键类注解为:@Embeddable,将主键属性注解为:@Id
2.将主键的属性注解为:@EmbeddedId
3. @IdClass(value=TeacherPk.class)和@Id

主键类为什么要序列化?如果多个该类对象同时放入内存中,在一个集群系统中,
其中一台服务器当机了,需要将内存中对象写到其它服务器。
同时,如果该服务器内存以满,需要用虚拟内存,这就需要序列化后才能写到硬盘上

主键类为什么需要重写hashCode()和equal()方法呢?这是为了保证对象唯一性的。
将许多对象放在内存中,他们之间用什么区分呢?数据库中用那个主键来区分的,
因此在这儿应该重写hashCode()和equal()方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐