[b]使用场合[/b]:
[size=medium]table1中主键id被table2作为外键引用,一条table1的记录可能有多条table2记录对应。
在页面上执行删除一条table1的操作, table1的id值传到java程序,删除table1的id=${id}之前必须删除table2关联的记录,因为有外键约束关系,所以必须先删除table2的相关记录,否则报错;而删除table2的记录不需要自己写代码删除, 因为有声明了hibernate one-to-many映射,直接删除table1的记录就行了。
[b]不过要注意的是, 删除table1的记录前, 要先通过id获取table1的记录对象,否则无法删除成功。[/b][/size]
[b]
举例[/b]==>
[b]逻辑[/b]: 一个邮件接收用户可以关联多个产品, 如果删除了邮件接收用户, 那么产品关联邮件接收用户表的记录也要删除。
[b]1) 数据库表[/b]:
2) Java代码:
/** TypeRelaUser.java */
/** TypeRelaUser.hbm.xml */
/** EmailUser.java */
/** EmailUser.hbm.xml */
/** EmailUserService.java */
/** EmailUserDAO.java */
[size=medium]table1中主键id被table2作为外键引用,一条table1的记录可能有多条table2记录对应。
在页面上执行删除一条table1的操作, table1的id值传到java程序,删除table1的id=${id}之前必须删除table2关联的记录,因为有外键约束关系,所以必须先删除table2的相关记录,否则报错;而删除table2的记录不需要自己写代码删除, 因为有声明了hibernate one-to-many映射,直接删除table1的记录就行了。
[b]不过要注意的是, 删除table1的记录前, 要先通过id获取table1的记录对象,否则无法删除成功。[/b][/size]
[b]
举例[/b]==>
[b]逻辑[/b]: 一个邮件接收用户可以关联多个产品, 如果删除了邮件接收用户, 那么产品关联邮件接收用户表的记录也要删除。
[b]1) 数据库表[/b]:
/*==============================================================*/
/* Table: 产品关联邮件接受用户表 */
/*==============================================================*/
CREATE TABLE IPMS_TYPE_RELA_USER (
ID varchar(64) not null,
PROJTYPEID varchar(64) null,
USERID varchar(64) null,
constraint PK_IPMS_TYPE_RELA_USER primary key nonclustered (ID)
)
go
ALTER TABLE IPMS_TYPE_RELA_USER
ADD CONSTRAINT FK_2 FOREIGN KEY (USERID)
REFERENCES IPMS_EMAIL_USER (ID)
go
/*==============================================================*/
/* Table: 邮件接受用户表 */
/*==============================================================*/
CREATE TABLE IPMS_EMAIL_USER (
ID varchar(64) not null,
NAME varchar(64) null,
ACCOUNTS varchar(64) null,
POSITION varchar(32) null,
EMAIL varchar(100) null,
constraint PK_IPMS_EMAIL_USER primary key nonclustered (ID)
)
go
2) Java代码:
/** TypeRelaUser.java */
public class TypeRelaUser extends BaseData{
/** id */
private String id;
/** 产品对象 */
private ProjectType projectType;
/** 邮件接收用户对象 */
private EmailUser emailUser;
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setProjectType(ProjectType projectType) {
this.projectType = projectType;
}
public ProjectType getProjectType() {
return projectType;
}
public void setEmailUser(EmailUser emailUser) {
this.emailUser = emailUser;
}
public EmailUser getEmailUser() {
return emailUser;
}
}
/** TypeRelaUser.hbm.xml */
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.toone.ipms.projtype.rela.model.TypeRelaUser" table="IPMS_TYPE_RELA_USER">
<id name="id" type="java.lang.String" column="ID">
<generator class="uuid.hex" />
</id>
<many-to-one name="projectType" column="PROJTYPEID" class="com.toone.ipms.projtype.type.model.ProjectType">
</many-to-one>
<many-to-one name="emailUser" column="USERID" class="com.toone.ipms.emailuser.model.EmailUser">
</many-to-one>
</class>
<query name="getAllTypeRelaUsers">
from TypeRelaUser c
order by c.id desc
</query>
<query name="deleteTypeRelaUsersByUserIds">
delete from TypeRelaUser c
where c.emailUser.id in (:userIds)
</query>
</hibernate-mapping>
/** EmailUser.java */
public class EmailUser extends BaseData{
/** id */
private String id;
/** 用户名 */
private String name;
/** 账号 */
private String accounts;
/** 职位 */
private String positionName;
/** 邮件地址 */
private String email;
/** 产品类型关联干系用户集合 */
private Set typeRelaUserSet = new HashSet();
/** 项目关联干系用户对象 */
private Set projRelaUserSet = new HashSet();
public void setTypeRelaUserSet(Set typeRelaUserSet){
this.typeRelaUserSet = typeRelaUserSet;
}
public Set getTypeRelaUserSet(){
return this.typeRelaUserSet;
}
public void setProjRelaUserSet(Set projRelaUserSet){
this.projRelaUserSet = projRelaUserSet;
}
public Set getProjRelaUserSet(){
return this.projRelaUserSet;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAccounts(String accounts) {
this.accounts = accounts;
}
public String getAccounts() {
return accounts;
}
public void setPositionName(String positionName) {
this.positionName = positionName;
}
public String getPositionName() {
return positionName;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
}
/** EmailUser.hbm.xml */
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.toone.ipms.emailuser.model.EmailUser" table="IPMS_EMAIL_USER">
<id name="id" type="java.lang.String" column="ID">
<generator class="uuid.hex" />
</id>
<property
name="name"
type="java.lang.String"
column="NAME"
length="64"
/>
<property
name="accounts"
type="java.lang.String"
column="ACCOUNTS"
length="64"
/>
<property
name="positionName"
type="java.lang.String"
column="POSITIONNAME"
length="32"
/>
<property
name="email"
type="java.lang.String"
column="EMAIL"
length="100"
/>
<set name="typeRelaUserSet" lazy="false" inverse="true" cascade="delete">
<key column="USERID" />
<one-to-many class="com.toone.ipms.projtype.rela.model.TypeRelaUser" />
</set>
<set name="projRelaUserSet" lazy="false" inverse="true" cascade="delete">
<key column="USERID" />
<one-to-many class="com.toone.ipms.proj.rela.model.ProjectRelaUser" />
</set>
</class>
<query name="getAllEmailUsers">
from EmailUser c
order by c.name, c.accounts
</query>
<query name="checkExistEmailUser">
from EmailUser c
where (c.id!=:id or :id is null)
and (:name is null or c.name=:name)
and (:accounts is null or c.accounts=:accounts)
and (:email is null or c.email=:email)
</query>
</hibernate-mapping>
/** EmailUserService.java */
public class EmailUserService {
protected EmailUserDAO emailUserDAO;
public void setEmailUserDAO(EmailUserDAO emailUserDAO) {
this.emailUserDAO = emailUserDAO;
}
/**
* 删除一个邮件接收人信息对象
* @param emailUser EmailUser对象
*/
public void deleteEmailUser(EmailUser emailUser) {
emailUser = emailUserDAO.getEmailUserById(emailUser.getId());
//注意这里,先获取一个emailUser对象,这个对象可能包含会级联删除的产品关联用户表记录对象
//如果不先获取接收邮件用户对象,则删除会失败
emailUserDAO.deleteEmailUser(emailUser);
}
}
/** EmailUserDAO.java */
public class EmailUserDAO extends BaseDAO {
/**
* 通过id获得邮件接收人信息对象
* @param id
* @return
*/
public EmailUser getEmailUserById( String id) {
return (EmailUser)this.load(EmailUser.class, id);
}
/**
* 删除一个邮件接收人信息对象
* @param emailUser EmailUser对象
*/
public void deleteEmailUser(EmailUser emailUser) {
this.delete(emailUser);
}
}