5、业务逻辑接口设计与实现

业务逻辑接口设计
1、打开Organization.hbm.xml
 <set access="field" name="children" inverse="true">
<key column="pid"/>
<one-to-many class="com.oa.model.Organization"/>
</set>

里面添加inverse="true",默认不写是false,双向关联,从parent加载children是可以的,从children加载parent也是可以的,这就是双向关联。
在bibernate里面如果从一的一方去加载多的一方就非常占内存,不容易,就像刘翔要记住13亿中国人一样困难,如果从多的一方去加载多的一方

就比较容易,就像13亿人去记住刘翔。这时就需要修改使inverse="true",让多的一方来维护一的一方。在Organization.java里面修改:
/**
* @hibernate.set inverse="true"//让多的一方来维护一的一方
* @hiberante.key column="pid"
* @hibernate.one-to-many class="com.oa.model.Organization"
*/
private Set<Organization> children;//一个机构的子机构(一个机构有多个子机构,所以是一对多的关系)


2、业务逻辑接口设计与实现
业务接口类
package com.oa.manager;
import java.util.List;
import com.oa.model.Organization;
public interface OrganizationManager {
/**
* 为什么不写成OrganizationID,设计上比较好,有pid,父机构的id就能得到对应的Organization
* 为什么传递参数的时候不传递children,因为我们设置了inverse="true",不让它从一的一方加载多的一方,因为那样比较占内存.
* @param org
* @param parentId
*/
void addOrganization(Organization org,int parentId);
void deleteOrganization(int orgId);
void modifyOrganization(Organization org,int parentId);
Organization findOrganization(int orgId);
/**
* 查询机构列表,如果parentId=0,那么就返回顶级机构列表,如果parentId!=0,则返回它的机构列表
* @return
*/
List<Organization> findOrganizations(int parentId);
}
写OrganizationManager的实现类,让实现类继承HibernateDaoSupport,因为hibernate的HibernateDaoSupport对dao进行了一次封装,我们继承它可以很方便的进行dao的操作。
OrganizationManagerImpl.java
package com.oa.manager.impl;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.oa.manager.OrganizationManager;
import com.oa.model.Organization;
public class OrganizationManagerImpl extends HibernateDaoSupport implements OrganizationManager {

public void addOrganization(Organization org, int parentId) {
if (parentId != 0)
org.setParent((Organization) getHibernateTemplate().load(Organization.class, parentId));
getHibernateTemplate().save(org);
}

public void deleteOrganization(int orgId) {
getHibernateTemplate().delete(getHibernateTemplate().load(Organization.class, orgId));
}

public Organization findOrganization(int orgId) {
return (Organization) getHibernateTemplate().load(Organization.class, orgId);
}

@SuppressWarnings("unchecked")
public List<Organization> findOrganizations(int parentId) {
return (List<Organization>) getHibernateTemplate().find("from Organization o where o.parent.id = ?",

parentId);//HQL语句
}

public void modifyOrganization(Organization org, int parentId) {
if (parentId != 0)
org.setParent((Organization) getHibernateTemplate().load(Organization.class, parentId));
getHibernateTemplate().update(org);
}
}
3、测试业务逻辑
1)修改applicationContext-common.xml:
<!-- configure transaction's propagational feature -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>

<!-- configure which class's which method take part in transaction -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.oa.manager.*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
2)配置applicationContext-beans.xml:
 <bean id="orgManager" class="com.oa.manager.impl.OrganizationManagerImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
3)测试类
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
负责业务逻辑的类都必须实现这个接口业务逻辑类BusinessImpl实现接口Business,BusinessImpl.java的示例代码如下: //******* Business.java************** public class BusinessImpl implement Business { private SaveData db; public void DiSaveDate (SaveData db) { this.db = db; } … //根据注入的存储类,存储数据 public void saveData() { … db.saveData(); … } } 编写测试类TestBusiness,TestBusiness.java的示例代码如下: //******* TestBusiness.java************** public class TestBusiness { private Business business = new BusinessImpl(); … //根据注入的存储类,存储数据 public void opraData() { … business. DiSaveDate (new XMLData()); business. saveData (); … } } 如果要完成依赖关系注入的对象,必须实现Business接口。 构造注入 构造注入是指在接受注入的类中定义一个构造方法,并在参数中定义需要注入的类。 (1)为了让类Business接受XMLData的注入,需要为它定义一个构造方法,来接受XMLData的注入。Business.java的示例代码如下: //******* Business.java************** public class Business { private SaveData db; public Business (SaveData db) { this.db = db; } … //根据注入的存储类,存储数据 public void saveData() { … db.saveData(); … } } (2)编写测试类TestBusiness,TestBusiness.java的示例代码如下: //******* TestBusiness.java************** public class TestBusiness { private Business business = new Business(new XMLData()); … //根据注入的存储类,存储数据 public void opraData() { … business. saveData (); … } } 即通过构造函数来完成依赖注入。 从前面对这三种依赖注入的方式中可以看出:其实所有的依赖注入都离不开抽象的支持,也就是说只有"面向接口编程",才能够实现依赖注入。 读者可能还会有疑惑:虽然具体的存储方式和业务逻辑无关了,可不是还要在调用业务逻辑的类里来改变具体的存储方式吗?这样一来,不是还要改代码吗?看起来面向接口编程也挺简单的,那Spring又为开发人员提供了哪些帮助呢?其实,Spring为开发人员提供了调用业务逻辑类的具体方式,也就是说,Spring不再需要开发人员编写调用具体调用业务逻辑的类,而是通过配置文档来实现业务逻辑的调用,如果具体的存储方式发生了变化,开发人员只需要改变相应的配置文档即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值