Hibernate one-to-many映射要注意的问题及详细例子

[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]:

/*==============================================================*/
/* 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);
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值