业务逻辑接口设计
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)测试类
分享到:
相关推荐
业务逻辑设计是软件开发过程中的一个关键步骤,它涉及到对业务流程和规则的分析、设计和实现。 在设计业务逻辑时,需要考虑到业务流程、数据模型、用户界面、安全性、性能等多个方面。业务逻辑设计的目的是为了实现...
只需创建一个模拟环境,直接调用业务逻辑接口,检查其输出是否符合预期,而不必关心其他组件的影响。 6. **扩展性**:如果需要添加新的业务逻辑或替换现有逻辑,只需要创建一个新的类实现相同的接口,然后在应用中...
5. **Interactor模式**:在Clean Architecture中,Interactor作为业务逻辑层的实体,处理特定的业务场景。视频可能介绍如何创建和使用Interactors来封装复杂逻辑。 6. **Error处理和异常安全**:视频可能会强调如何...
综上所述,银企直联系统接口的设计与实现是当前银行业务发展中的一项关键技术。通过合理的系统架构设计和技术选型,不仅能够提高银行与企业之间的数据交换效率,还能确保数据的安全性和系统的稳定性。随着信息技术的...
分层架构与业务逻辑实现方式 一、分层架构 在当今软件系统中,分层架构思想是现代软件架构的主要思想,无论是企业级应用系统、专用软件还是协议,都采用分层架构思想进行设计。分层架构是一种设计思想,也可以称之...
在软件开发中,接口设计模式是一种重要的设计模式,它定义了对象之间交互的边界,使得系统各部分可以独立地...在实际开发过程中,我们需要结合业务需求,遵循设计原则,选择合适的工具,以实现高效且高质量的接口设计。
本资源提供的"基于C#+ASP.NET的实现的动态创建数据访问层及业务逻辑层类库及例子源码"是一个很好的学习和实践平台,可以帮助开发者更高效地构建此类系统。 首先,我们来理解数据访问层(DAL)。数据访问层是应用和...
视频可能涵盖了如何设计和实现业务逻辑类,以及如何在这些类中封装业务规则。 3. **MVP或MVVM架构**:在Android开发中,常见的架构模式有Model-View-Presenter(MVP)和Model-View-ViewModel(MVVM)。这两种架构都...
BLL的目的是将复杂的业务逻辑与用户界面和数据存储分离,以实现更高的灵活性。 数据访问层(DAL)专注于与数据库的交互,负责数据的增、删、改、查操作。DAL提供了一组接口或类,使得上层的BLL可以无需关心具体的...
在本示例中,我们将探讨如何使用Struts 1.x版本将业务逻辑分离到业务层,这是一个重要的设计原则,可以提高代码的可读性、可维护性和可测试性。MyEclipse 6.5是一个集成开发环境,它为Struts项目提供了很好的支持。 ...
通过Web服务协议(如SOAP或RESTful API),业务逻辑服务可以对外提供接口,使得不同分支机构或外部合作伙伴能够灵活地接入,实现自动化数据交互,提高协作效率。 例如,对于金融企业,它们可能需要与多家银行或金融...
控制层依赖于业务逻辑层,只与接口耦合,但绝不与任何具体的业务逻辑组件耦合;同样,业务逻辑层依赖于DAO层,也不会与任何 具体的DAO组件耦合,而是面向接口编程。采用这种方式的软件实现,即使软件的部分发生改变...
标题"Delphi 三层 界面和逻辑的分离 抽取DAO层"明确指出,这个小例子将展示如何在Delphi中实现三层架构,特别是如何分离界面(UI)与业务逻辑(BL),并抽取出数据访问对象(DAO)层。DAO层是数据访问层的核心,负责...
本文将深入探讨如何使用Python3.x和PyQt5通过QSplitter组件动态加载多个子窗体,并且重点讲解如何在第三个子窗体中实现界面与业务逻辑的分离。 QSplitter是PyQt5中的一个关键部件,它允许用户通过拖动分隔条来调整...
正确的做法是将这些不同的业务逻辑拆分为独立的接口来实现。 3. **高内聚低耦合**:确保每个接口内部的业务逻辑紧密相关,而不同的接口之间保持较低的相互依赖程度。例如,在某些情况下,查询会员信息的同时可能会...
这个接口位于业务逻辑层和数据访问层之间,业务层通过调用接口方法与数据库进行交互,而不直接接触具体的数据库实现,如JDBC。 ```java public interface JdbcService { List<User> getUsers(); void addUser...
3. **降低耦合度**:主应用程序与业务逻辑分离,使系统设计更加灵活,便于扩展和维护。 4. **安全性**:通过权限控制,可以限制对业务逻辑的访问,防止恶意修改或滥用。 在提供的文件列表中,我们可以看到一些常见...