一、one-to-one
create table `wife` (
`id` int(11) not null auto_increment,
`name` varchar(50) not null,
primary key (`id`)
`id` int(11) not null auto_increment,
`name` varchar(50) not null,
primary key (`id`)
) engine=innodb default charset=utf8
create table `husband` (
`id` int(11) not null auto_increment,
`name` varchar(50) not null,
`wifeid` int(11) default null,
primary key (`id`),
unique key `wifeid` (`wifeid`),
key `fk_wife` (`wifeid`),
constraint `fk_wife` foreign key (`wifeid`) references `wife` (`id`)
) engine=innodb default charset=utf8
public class Wife {
private Integer id;
private String name;
private Husband husband;
/*getter,setter,构造方法*/
}
Wife.hbm.xml
<one-to-one name="husband" class="hbm.Husband" property-ref="wife" cascade="all"/>
private String name;
private Husband husband;
/*getter,setter,构造方法*/
}
Wife.hbm.xml
<one-to-one name="husband" class="hbm.Husband" property-ref="wife" cascade="all"/>
public class Husband {
private Integer id;
private Wife wife;
private String name;
/*getter,setter,构造方法*/
}
private Wife wife;
private String name;
/*getter,setter,构造方法*/
}
Husband.hbm.xml
<many-to-one name="wife" class="hbm.Wife" fetch="select" cascade="all">
<column name="wifeid" unique="true"/>
</many-to-one>
<!--
注意:many-to-one这个放在外键对应表所对应对象配置文件里,这里这个column必须要有,表示与wife对应的字段,怎么关联wife对象
这里其实是特殊一对一,unique必须设为true,如果是false,则是一对多不是一对一,级联cascade应该为all,因为操作一方,另一方也应该改变 -->
</many-to-one>
<!--
注意:many-to-one这个放在外键对应表所对应对象配置文件里,这里这个column必须要有,表示与wife对应的字段,怎么关联wife对象
这里其实是特殊一对一,unique必须设为true,如果是false,则是一对多不是一对一,级联cascade应该为all,因为操作一方,另一方也应该改变 -->
二、
many-to-one
public class People {
private Integer id;
private String name;
private Book book;
}
People.hbm.xml
<many-to-one name="book" class="hbm.Book" cascade="all">
<column name="bookid" />
</many-to-one>
public class Book {
private Integer id;
private String name;
}
Book.hbm.xml不需要加配置
三、one-to-many
public class Department {
public class Department {
private Integer id;
private String name;
private Set<Employee> employees; //一端执有多端的一个集合引用
}
Department.hbm.xml
<!-- 当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan -->
Department.hbm.xml
<!-- 当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan -->
<set name="employees" inverse="true" cascade="all-delete-orphan" >
<key column="department_id"/>
<one-to-many class="hbm.Employee" />
</set>
public class Employee {
private Integer id;
private String name;
private Department department; //持有关联实体类的一个引用
}
Employee.hbm.xml
<!-- 映射员工到部门的多对一 -->
Employee.hbm.xml
<!-- 映射员工到部门的多对一 -->
<many-to-one name="department" column="department_id" not-null="true" foreign-key="fk_emp_dept"/>
四、many-to-many
public class Actor {
private int id;
private String name;
private Set<Role> roles = new HashSet<Role>(0);// 角色集合
private int id;
private String name;
private Set<Role> roles = new HashSet<Role>(0);// 角色集合
}
Actor.hbm.xml
<set name="roles" table="t_actor_role" inverse="true" cascade="save-update">
<set name="roles" table="t_actor_role" inverse="true" cascade="save-update">
<key column="actor_id"/>
<many-to-many column="role_id" class="domain.Role" />
</set>
public class Role {
private int id;
private String name;
private Set<Actor> actors = new HashSet<Actor>(0);// 演员集合
}
Role.hbm.xml
<set name="actors" table="t_actor_role" inverse="false" cascade="all">
<set name="actors" table="t_actor_role" inverse="false" cascade="all">
<key column="role_id"/>
<many-to-many column="actor_id" class="domain.Actor"/>
</set>
many-to-many注意事项:
1.数据库名要设置在配置文件hibernate.cfg.xml中,否则找不到中间表
2.一方要设置inverse="true",另一方要设置inverse="false"。inverse="false"的一方保存时,维护多对多之间的关系,且只要将相互的关系告诉这一方即可。如果inverse都设置为true,双方的关系将都不到维护。如果都设置为false,双方将共同维护之间的关系,这时,要将双方的包含关系都要设置清楚,否则将会导致关系维护混乱。
3.如果设置了casade="save-update",只能设置一方,如果双方都设置的话,当更新一方的时候,同时会更新另一方,另一方的更新又会导致一方的更新。
注意事项:
1.cascade几种取值:
save-update: 级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除
delete: 级联删除, 但不具备级联保存和更新
all-delete-orphan: 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新.
all: 级联删除, 级联更新,但解除父子关系时不会自动删除子对象.
delete-orphan:删除所有和当前对象解除关联关系的对象
none:级联保存和级联更新总是集合在一起的, 所以没单独的save 或 updata
2.delete,update使用需要事务
save-update: 级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除
delete: 级联删除, 但不具备级联保存和更新
all-delete-orphan: 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新.
all: 级联删除, 级联更新,但解除父子关系时不会自动删除子对象.
delete-orphan:删除所有和当前对象解除关联关系的对象
none:级联保存和级联更新总是集合在一起的, 所以没单独的save 或 updata
2.delete,update使用需要事务