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