天天看點

hibernate 雙向一多對關聯 删除一端時級聯删除多端

//部門

public class Department {

private Long id;

private String name;

private String description;

private Set<Employee> employees; //一端執有多端的一個集合引用

getter();

setter();

}

//員工

public class Employee {

private Long id;

private String username;

private Date joinTime;

private Department dept; //持有關聯實體類的一個引用

getter();

setter();

}

//部門表的映射檔案

<hibernate-mapping>

<class name="com.liuc.domain.Department" table="dept">

<id name="id" column="id">

<generator class="native"/>

</id>

<property name="name"/>

<property name="description"/>

<set name="employees" inverse="true" cascade="all-delete-orphan" >

<key column="dept_id"/>

<one-to-many class="com.liuc.domain.Employee" />

</set>

</class>

</hibernate-mapping>

員工表的映射檔案

<hibernate-mapping>

<class name="com.liuc.domain.Employee" table="emp">

<id name="id" column="id">

<generator class="native"/>

</id>

<property name="username"/>

<property name="joinTime" column="join_time"/>

<!-- 映射員工到部門的多對一 -->

<many-to-one name="dept" column="dept_id" not-null="true" foreign-key="fk_emp_dept"/>

</class>

</hibernate-mapping> 

生成的表結構

create table dept (

id bigint not null auto_increment,

name varchar(255),

description varchar(255),

primary key (id)

);

create table emp (

id bigint not null auto_increment,

username varchar(255),

join_time datetime,

dept_id bigint not null,

primary key (id)

); 

測試jUnit3

如果是jUnit4 可以@Test

public class MappingTest {

private static SessionFactory sessionFactory;

@BeforeClass

public static void init(){

sessionFactory = HibernateUtil.getSessionFactory();

}

@AfterClass

public static void destroy(){

sessionFactory = null;

}

@Test

public void testSave(){

Session session = sessionFactory.openSession();

session.beginTransaction();

Department dept = new Department();

dept.setName("研發部");

dept.setDescription("研發公司的産品");

session.save(dept);

Employee emp = new Employee();

emp.setUsername("張三");

emp.setJoinTime(new Date());

emp.setDept(dept); //設定它們關聯關系

session.save(emp);

session.getTransaction().commit();

session.close();

}

SQL語句

Hibernate:

insert

into

dept

(name, description)

values

(?, ?)

Hibernate:

insert

into

emp

(username, join_time, dept_id)

values

(?, ?, ?)

級聯删除,删除一個部門級職删除一個部門下的所有員工

@Test

public void testDelete(){

Session session = sessionFactory.openSession();

session.beginTransaction();

Department dep =(Department)session.get(Department.class, Long.valueOf(2));

session.delete(dep);

session.getTransaction().commit();

session.close();

}

SQL語句

Hibernate:

select

department0_.id as id0_0_,

department0_.name as name0_0_,

department0_.description as descript3_0_0_

from

dept department0_

where

department0_.id=?

Hibernate:

select

employees0_.dept_id as dept4_1_,

employees0_.id as id1_,

employees0_.id as id1_0_,

employees0_.username as username1_0_,

employees0_.join_time as join3_1_0_,

employees0_.dept_id as dept4_1_0_

from

emp employees0_

where

employees0_.dept_id=?

Hibernate:

delete

from

emp

where

id=?

Hibernate:

delete

from

dept

where

id=?

繼續閱讀