1、解决的问题:一个客户,有多个销售记录,有多个合同记录,有多个服务记录,有多个......,在这种结构,为了实现松耦合,销售记录、合同记录中,只记录下客户的id和name(以方便展示),但:当一个客户名称更新时,所有和它相关的数据如何同步更新。有一种方法,就是将客户更新的地方写代码更新和它相关的数据,但这样对紧紧耦合在一起。第二种方法,手动写一个类似触发器的东西来实现。
2、bo类结构展示
客户类:
public class Client
{
@Id
@GeneratedValue(generator = "uuidGenerator")
@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
@Column(length = 32)
private String id;//标识
@Column(length = 10)
private String code; //编号
@Column(length = 50)
private String name; //名称
//其他省略
}
客户销售记录类
public class Sell
{
@Id
@GeneratedValue(generator = "uuidGenerator")
@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
@Column(length = 32)
private String id;//标识
@Column
private double price;//单价
@Column
private double amount;//数量
@Column
private double money;//金额
@Column(length = 32)
private String clientId; //客户ID
@Column(length = 50)
private String clientName; //客户名称
//其他省略
}
客户合同记录类
public class Contract
{
@Id
@GeneratedValue(generator = "uuidGenerator")
@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
@Column(length = 32)
private String id;//标识
@Column(length = 20)
private String code; //合同编码
@Column(length = 50)
private String name; //合同名称
@Column(length = 32)
private String clientId; //客户ID
@Column(length = 50)
private String clientName; //客户名称
//其他省略
}
3、客户更新触发器接口的定义
public interface TriggerClientUpdateInf
{
List<TriggerClientUpdateInf> ls=new ArrayList<TriggerClientUpdateInf>(); //存放所有实现该接口的类对象
/**
* 功能描述:客户信息更新后触发
*</br>日期:2012-4-16
*</br>@author : 劲风
*</br>@param dao 数据库操作类
*</br>@param dto 客户DTO,主要传入要更新客户的id和更新后的名称
*/
public void afterClientUpdate(Dao dao,ClientDto dto);
}
4、销售记录对触发器的实现
@org.springframework.stereotype.Service //为了让spring将该类管理,以便将类载入内存,以便执行static中的语句
public class TriggerClientUpdateSell implements TriggerClientUpdateInf
{
@Override
public void afterClientUpdate(Dao dao, ClientDto dto)
{
String hql="update Sell t set t.clientName='"+dto.getName+"' where t.clientId='"+dto.getId+"'";
dao.updateByHql(hql);
}
static
{
TriggerClientDeleteInf.ls.add(new TriggerClientUpdateSell());
}
}
5、合同记录对触发器的实现
@org.springframework.stereotype.Service //为了让spring将该类管理,以便将类载入内存,以便执行static中的语句
public class TriggerClientUpdateContract implements TriggerClientUpdateInf
{
@Override
public void afterClientUpdate(Dao dao, ClientDto dto)
{
String hql="update Contractt set t.clientName='"+dto.getName+"' where t.clientId='"+dto.getId+"'";
dao.updateByHql(hql);
}
static
{
TriggerClientDeleteInf.ls.add(new TriggerClientUpdateContract());
}
}
6、在客户更新处的代码
...
List<TriggerClientUpdateInf> ls =TriggerClientUpdateInf.ls;
for(TriggerClientUpdateInf tr:ls)
{
tr.afterClientUpdate(dao,clientDto); //
}
...
如此,便可用实现TriggerClientUpdateInf来实现构耦合。(1)在客户更新处,会将所有放入list中的实现TriggerClientUpdateInf接口的对象的afterClientUpdate方法执行一遍。谁放的,放的什么,我不关心,我只认这个接口,执行一扁即可。(2)其它关心客户更新的模块,如销售记录,只需要实现接口,并将一个实例放入list中即可!
分享到:
相关推荐
中山大学软件工程数电实验jk触发器实现74ls194全部功能
数电课程设计报告--quartus ll软件设计环境中利用一位全加d锁存器或者d触发器实现8位二进制加法器.docx数电课程设计报告--quartus ll软件设计环境中利用一位全加d锁存器或者d触发器实现8位二进制加法器.docx数电课程...
使用SQL Server触发器实现数据表的级联更新.pdf
用触发器实现每个学生最多只能选择3门课程的代码如下: use 学生档案 go create trigger elective_restrict on 选课表 for insert, update as begin if update (课程号) begin declare @num varchar(10) declare...
本资源实现的一个用java代码实现数据二维码图片的生成,用触发器实现将生成的二维码图中转换成blob格式并插入到数据表中
使用java代码自动生成数据库触发器,需要更改表明即可。
计数器
使用Java编写Oracle触发器的实现.pdf
JK触发器实现74LS194以及74LS197功能.pdf
java代码 job_触发器例子
SQL server创建触发器实现级联删除
用java编写一个简易的网吧计费系统,用hibernate框架,sql2008数据库或者是2005数据库,用户sa密码123456,在数据库中用到触发器,在程序中使用线程来计算钱 实现的主要功能是练习线程、hashmap、hibernate、全局...
个人亲测oracle触发器调用java程序
oracle触发器实现主键自动增长操作
在数据库管理 系统中,保证数据库的完整性至关重要。本文简要介绍了触发器的概念和类型,重点讨论了触发器的工作原理及其使用时要考虑的事项,并给出用触发器实现数据完整性的应用实例 。 值得一看!
子表+触发器实现数据同步
触发器,在我们学习中,可以帮助我们了解触发器
触发器9.18触发器9.18触发器9.18触发器触发器9.18触发器9.18触发器9.18触发器
Unity3D教程:简单触发器实现自动开关门创建完毕之后,去掉勾选的MeshRender使得球体变成透明的:Unity3D教程:简单触发器实现自动开关门给这个球