您的位置:首页 > 其它

Hibernate 实体级联配置(one-to-one,many-to-one,many-to-many)

2017-09-07 19:06 393 查看
一、one-to-one
create table `wife` (

`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"/> 

public class Husband { 
    private Integer id; 

    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

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 {
     private Integer id; 
     private String name; 
     private Set<Employee> employees;  //一端执有多端的一个集合引用 
}

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
<!-- 映射员工到部门的多对一 --> 
<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);// 角色集合
}

Actor.hbm.xml
<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">
        <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使用需要事务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate 实体级联