Hibernate串讲笔记二

三、Hibernate中自带ID的generator的含义:

1、identity:用于MySql数据库。特点:递增

<id name="id" column="id">
<generator class="identity"/>
</id>

注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。

2、sequence:用于Oracle数据库

<id name="id" column="id">
<generator class="sequence">
<param name="sequence">序列名</param>
</generator>
</id>

3、native:跨数据库时使用,由底层方言产生。遇Oracle采用sequence; 遇MySQL采用identity。Default.sequence为hibernate_sequence

<id name="id" column="id">
<generator class="native"/>
</id>

注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。如果Oracle中没有该序列,连Oracle数据库时会报错。

4、hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。

<id name="id" column="id">
<generator class="hilo">
<param name="table">high_val</param>
<param name="column">nextval</param>
<param name="max_lo">5</param>
</generator>
</id>

5、sequencehilo:同过高低位合成id,建一个sequence序列,不用建表。

<id name="id" column="id">
<generator class="hilo">
<param name="sequence">high_val_seq</param>
<param name="max_lo">5</param>
</generator>
</id>
6、assigned:用户自定义id;
<id name="id" column="id">
<generator class="assigned"/>
</id>

7、foreign:用于一对一关系共享主健时,两id值一样。

四、Hibernate类关系的处理:

1、One―to―One关系在数据库中如何体现,在JavaBean中如何体现,在Hibernate中如何映射one-to-one关系。

  • 1、数据库中:一个表的外健对应另一个表的主健,外健要加上Unique约束。或者是两个表共享一个主健。
    2、javaBean中:在JavaBean中增加一个属性,即另外一个对象的引用,可以单向也可以双向。
    3、在hibernate中:

主健映射:都是one-to-one 要用foreign生成策略。

外健映射:主表中用one-to-one,副表通过property-ref  many-to-one

201066-1017315

建表语句如下:

create table engine_fk (
id number(10,0) not null,
model varchar2(20) not null,
manufacturer varchar2(50) not null,
producedate date,
carid number(10,0) unique,
primary key (id)
);
alter table engine_fk
add constraint fk_engine_car_fk
foreign key (carid)
references car_fk(id);

2、Many-to-One关系在数据库中如何体现,在JavaBean中如何体现,在Hibernate中如何映射many-to-on关系。

  • 1、数据库中:一个表的主健对应另一个表的外健。
    2、javaBean中:一个对象包含另一个对象的一个引用,另一个对象包含这个对象的一组(集合,用set)引用。
    3、在hibernate中:用set.key指定具体列。

在Set一端一定要写inverse=“true”表示忽略集合一端的变化。

以Order类和Item类 的一对多关系为例子(详见代码):

201066-101723812

小结:

对象的关联关系有一对一、一对多、多对一和多对多,其中多对一和一对多关系比较常见。
一对一关系有两中方式:以主键关联和以外键关联。

一对多和多对一通常应设置为双向关联,并在“一”这一方设置inverse="true"(比如一个班级对应多个学生,在班级这一边设置inverse="true")。设置了inverse="true"这一端比较清闲,它把控制权交给了另一端。让“多”这一端有控制权。

多对多 可以借助中间表来保存两个实体之间的关系。


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。