看尚学堂Hibernate视频做的一些笔记,仅供参考。。。
Mysql的自增字段用auto_increment,Oracle的自增字段用sequence。
<generator class=”increment”></generator>在集群环境下不要使用,因为ID容易重复。Increment用的很少。
当generator是native时,表示根据数据库选择用identity(mysql下就是auto_increment),sequence(Oracle下)或者hilo。用的最多。此时Id要是int类型,Identity,sequence和uuid(要求id是String类型)用的也挺多。要想使数据库跨平台,应该用native或者uuid。
Oracle中表名不允许用_开头。
在Annotation中加ID生成器就是在@Id注解下加@GeneratedValue,默认是AUTO,相当于xml的native,对MySQL使用auto_increment,对Oracle使用HIBERNATE_SEQUENCE(名称固定,先用select hibernate_sequence.nextval from dual取出最大值),对SqlServer用identity。
@GeneratedValue还可以是INDENTITY,SEQUENCE,TABLE,如@GeneratedValue(strategy=GenerationType.IDENTITY)
要想Oracle中产生的sequence的 名字是自己定义的,可以如下:
在@Entity下加@SequenceGenerator(name=”teacherSequence”, sequenceName=”teacherSequence_DB”),name指的是这个sequence生成器的名字,sequenceName指的是在数据库中生成的sequence的名字。
然后@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=” teacherSequence”)
这样该实体类所用的sequence就是teacherSequence_DB这个sequence了。
也可以定义TableGenerator,用生成的表中的数值来生成主键,做法如下:
在@Entity下加@TableGenerator(
name=”Teacher_GEN”,
table=”GENERATOR_TABLE”,
pkColumnName=”pk_key”,不能用key,因为是关键词
valueColumnName=”pk_value”,
pkColumnValue=”Teacher”,
allocationSize=1
)
生成的表名为GENERATOR_TABLE,总共有两个字段,主键的字段名为key,另一个字段名为value。pkColumnValue=”Teacher”,指的是有一条记录,这条记录的key是Teacher,默认的value字段的值是1,value字段的值就是要拿到的id值。取完一个值后,这条记录的value字段的值就加上allocationSize的值,变成了2. 拿id值的sql语句相当于select value from GENERATOR_TABLE where key = ‘Teacher’; 如果这个TableGenerator为n张表提供id值,那么相应的就有n条记录,只是每条记录的key值不一样而已。
然后使用的话在@Id注解下加上@GeneratedValue(strategy=GenerationType.TABLE, generator=” Teacher_GEN”)
这种TableGenerator可以跨数据库平台,里面的数据也可以跨平台。不过实际上跨数据库平台这种需求比较少。
@Entity下可以定义多个Generator,下面要用哪个就写哪个的name值。
基于xml的联合主键:
先写一个主键类,如StudentPK,里面只有id,name两个字段。再加上get,set方法。然后再Student类中声明private StudentPK pk; Student和StudentPK是组合关系。
然后在Student.hbm.xml映射文件中加入:
<composite-id name=”pk” class=”com.hibernate.StudentPK”>
<key-property name=”id” ></key-property>
<key-property name=”name” ></key-property>
</composite-id>
StudentPK还要重写equals,hashCode方法(保证StudentPK对象都是唯一的),实现Serializable接口(因为要把StudentPK对象进行序列化(写到硬盘上,或者进行网络传输),即固化到数据库中。或者当某台服务器死机的时候可以把内存中的Student对象传输到另一台服务器中。或者当内存满了的时候,使用虚拟内存(把硬盘上的一部分空间作为内存),这样就可以把一部分Student对象序列化到硬盘上)。
重写equals方法:
@Override
public Boolean equals(Object o) {
if (o instanceof StudentPK) {
StudentPK pk = (StudentPK) o;
If (this.id == pk.getId() && this.name.equals(pk.getName())) {
Return true;
}
}
Return false;
}
重写hashCode方法
@Override
public int hashCode() {
return this.name.hashCode();
}
hashTable的结构:实际上hashTable很多时候就是一个数组,数组里面有很多位置,hashCode相同的对象是放在同一个位置中的,所以同一个位置中的对象往往是以链表的形式存放的。链表里所有的对象都是hashCode相同的。当我们从hashTable中查找一个对象时,先根据该对象的hashCode找到相应的位置,再遍历这个位置中的链表中的对象,根据equals方法进行匹配。
要将一系列的Student对象装到HashTable中,需要先计算每个Student对象的hashCode,然后根据hashCode将Student对象装到HashTable中。但不会直接计算Student对象的hashCode,因为数据库的逻辑,区分不同的Student对象是根据StudentPK来决定的,所以应该计算StudentPK对象的hashCode。
基于Annotation的联合主键:
一共有三种做法:
将组件类注解为@Embeddable,并将组件的属性注解为@Id
即将TeacherPK注解为@Embedddable(可以被嵌入的),将Teacher类中的public TeacherPK getPk(){}注解为@Id,而不是将TeacherPK中的属性注解为@Id。
将组件的属性注解为@EmbeddedId
不要将TeacherPK注解为@Embedddable,直接将Teacher类中的public TeacherPK getPk(){}注解为@EmbeddedId,这种比较常用。
将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id
Teacher类中不需要TeacherPK属性,还是以前的id和name,在Teacher类前加上@IdClass(TeacherPK.class),然后在id和name的get方法前都加@Id就可以了。但是这时从数据库中读取记录的时候或者把Teacher对象存放在Map中时还是需要TeacherPK主键对象的。
分享到:
相关推荐
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...
### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键要素之一。在实际应用中,开发者经常需要处理不同类型的数据库,并且需要应对各种不同的主键生成需求。...
### Hibernate 主键生成策略详解 Hibernate 是一款流行的 Java 持久层框架,它提供了对象关系映射(ORM)的功能,使得 Java 开发者能够更高效地与数据库进行交互。在 Hibernate 中,主键生成策略是一项核心功能,...
Hibernate主键生成策略.docHibernate主键生成策略.doc
### hibernate主键生成策略详解 #### 一、assigned **assigned** 主键生成策略意味着主键的值是由外部程序负责生成的,并且在执行 `save()` 方法之前必须明确指定一个值。在这种策略下,Hibernate 不参与主键的...
在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一种流行的 Java 持久化框架,它简化了数据库操作,并提供了多种主键生成策略。主键是表中的一个或多个字段组合,用于唯一标识表中的每一条记录。...
Hibernate各种主键生成策略详解,包括 assigned increment hilo seqhilo sequence identity native uuid foreign uuid.hex sequence-identity 等
### Hibernate 主键生成策略与配置详解 #### 一、概述 在使用Hibernate进行持久化操作时,合理选择和配置主键生成策略对于确保数据的一致性和优化性能至关重要。本文将详细介绍几种常见的主键生成策略,并结合示例...
Hibernate主键生成策略详细介绍 在Java探索中,Hibernate提供了多种主键生成策略,满足不同场景下的需求。下面是对Hibernate主键生成策略的详细介绍: 1. Increment主键生成策略 Increment主键生成策略是由...
### Hibernate主键生成策略 1. **`native`**:类似于JPA的`GenerationType.AUTO`,根据底层数据库选择合适的生成策略。 2. **`identity`**:相当于JPA的`GenerationType.IDENTITY`,适合自动增长主键的数据库。 3...
以下是对Hibernate主键生成策略的详细说明: 1. **assigned**: 这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate不参与主键的生成,这意味着主键生成完全由应用控制,可以与数据库无关。这种...