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

来源:互联网 发布:淘宝上那家卖警服 编辑:程序博客网 时间:2024/05/16 01:56

在数据库中,通常主键都有自动增长功能。如: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()方法

 

 

 

原创粉丝点击