例如,在更新ID为1的EMPLOYEE时,删除此employee_id表CERTIFICATE中的所有先前记录并插入新记录的最佳方法是什么? 例如,员工id = 1有A,B证书,当更新员工时删除该员工的所有证书并再次插入,即使证书是A,B或新的C,D。
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
create table CERTIFICATE (
id INT NOT NULL auto_increment,
certificate_name VARCHAR(30) default NULL,
employee_id INT default NULL,
PRIMARY KEY (id)
);
Hibernate映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<id name="id" type="int" column="id">
<generator class="sequence">
<param name="sequence">employee_seq</param>
</generator>
</id>
<set name="certificates" lazy="false" cascade="all">
<key column="employee_id" not-null="true"/>
<one-to-many class="Certificate"/>
</set>
<property name="firstName" column="first_name"/>
<property name="lastName" column="last_name"/>
<property name="salary" column="salary"/>
</class>
<class name="Certificate" table="CERTIFICATE">
<id name="id" type="int" column="id">
<param name="sequence">certificate_seq</param>
</id>
<property name="employee_id" column="employee_id" insert="false" update="false"/>
<property name="name" column="certificate_name"/>
</class>
</hibernate-mapping>
答案 0 :(得分:1)
您应该在映射中使用CASCADE
以自动删除相关记录。
这将删除具有certificates
外键的所有employee
。
<class name="Certificate" table="CERTIFICATE" cascade="delete-orphan, save-update" >
<id name="id" type="int" column="id">
<param name="sequence">certificate_seq</param>
</id>
<property name="name" column="certificate_name"/>
<key>
<property name="employee_id" column="employee_id" insert="false" update="false" not-null="true"/>
</key>
<one-to-many class="com.your.package.Certificate" />
</class>
现在,您可以修改certificates
课程中的employee
集合。通过执行employee.saveOrUpdate
,您的证书将被相应地保存/删除。
我没有测试过这个。但你应该明白这个想法。 Here是级联类型的示例。