Операция удаления каскада не работает должным образом в спящем режиме - PullRequest
3 голосов
/ 04 октября 2011

Я попытался реализовать cascaded = "delete" следующим образом, но удаляется только строка сотрудника, а не соответствующая строка зарплаты. Класс pojo сотрудника:

public class Employee {
int empid;
String ename;
Salary sal;
//gettrs and setters

Занятия по зарплате уроки:

public class Salary {
int sid;
double netsal;
Employee employee;
    //getters and setters

Файл employee.hbm:

<hibernate-mapping>
<class name="employee.Employee" table="EMPLOYEE">
    <id name="empid" type="int">
        <column name="EMPID" />
        <generator class="assigned" />
    </id>
    <property name="ename" type="java.lang.String">
        <column name="ENAME" />
    </property>
    <many-to-one name="sal" class="employee.Salary" cascade="delete">
        <column name="sid" />
    </many-to-one>
</class>

Файл salary.hbm:

<hibernate-mapping>
<class name="employee.Salary" table="SALARY">
    <id name="sid" type="int">
        <column name="sid" />
        <generator class="increment" />
    </id>
    <property name="netsal" type="double">
        <column name="netsal" />
    </property>
</class>

и соответствующие таблицы mysql создаются как:

create table employee(EMPID int(5) primary key,ENAME varchar(20),sid int(5),foreign key(sid) references salary(sid));
create table salary(sid int(5) primary key,netsal int(5));

после вставки записей вроде:

SessionFactory sf= new Configuration().configure().buildSessionFactory();
    session= sf.openSession();
    Transaction tx= session.beginTransaction();
    Employee emp=new Employee();
    emp.setEmpid(12);
    emp.setEname("some name");
    Salary sal=new Salary();
    sal.setNetsal(12000);
    emp.setSal(sal);
    sal.setEmployee(emp);
    tx.commit();
    session.flush();
    session.close();

когда я делаю

Query query = session.createQuery("delete from employee e where e.empid=12");
    query.executeUpdate();

затем запись в таблице сотрудников удаляется, но соответствующая запись в таблице зарплат сохраняется. Так как же обеспечить удаление соответствующей записи зарплаты? Спасибо.

1 Ответ

10 голосов
/ 04 октября 2011

Каскад не работает при удалении объектов с использованием запросов на удаление в стиле DML.Это будет работать, только если вы удалите сотрудника, используя сеанс:

Employee e = (Employee) session.load(Employee.class, 12);
session.delete(e);
...