3 Stimmen

cacade-Löschvorgang funktioniert in Hibernate nicht wie erwartet

Ich habe versucht, cascaded="delete" wie folgt zu implementieren, aber nur die Mitarbeiterzeile wird gelöscht und nicht die entsprechende Gehaltszeile. Die Klasse Employee pojo ist :

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

Die Gehaltsklasse pojo ist :

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

die Datei employee.hbm lautet :

<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>

die Datei salary.hbm ist:

<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>

und die entsprechenden mysql-Tabellen werden wie folgt erstellt:

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));

nach dem Einfügen von Datensätzen wie:

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();

wenn ich es tue

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

Dann wird der Eintrag in der Mitarbeitertabelle gelöscht, aber der entsprechende Eintrag in der Gehaltstabelle bleibt bestehen, wie kann ich also sicherstellen, dass der entsprechende Gehaltseintrag ebenfalls gelöscht wird? Danke!

10voto

JB Nizet Punkte 654813

Die Kaskade funktioniert nicht, wenn Entitäten mit DML-artigen Löschabfragen gelöscht werden. Sie funktioniert nur, wenn Sie den Mitarbeiter über die Sitzung löschen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X