三、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
建表语句如下:
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类 的一对多关系为例子(详见代码):
小结:
对象的关联关系有一对一、一对多、多对一和多对多,其中多对一和一对多关系比较常见。
一对一关系有两中方式:以主键关联和以外键关联。
一对多和多对一通常应设置为双向关联,并在“一”这一方设置inverse="true"(比如一个班级对应多个学生,在班级这一边设置inverse="true")。设置了inverse="true"这一端比较清闲,它把控制权交给了另一端。让“多”这一端有控制权。
多对多 可以借助中间表来保存两个实体之间的关系。
如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。

