Java 三层系统中的业务逻辑应该放在哪里?
我知道关于我的问题有很多问题,我读了很多书,但我仍然觉得有点愚蠢,因为我还没有理解。所以我正在我的特殊问题上尝试 我正在执行学校的工作。它应该是信息系统的一部分,必须分层。我们必须用Java或C(我选择了Java)编写它。我们必须使用两个不同的数据源和两个不同的视图,在我的例子中,oracledb和xml作为数据源,javaswing和JSF作为视图 根据Martin Fowler的《企业应用程序架构模式》一书,有三个主要层:Java 三层系统中的业务逻辑应该放在哪里?,java,swing,hibernate,jsf,Java,Swing,Hibernate,Jsf,我知道关于我的问题有很多问题,我读了很多书,但我仍然觉得有点愚蠢,因为我还没有理解。所以我正在我的特殊问题上尝试 我正在执行学校的工作。它应该是信息系统的一部分,必须分层。我们必须用Java或C(我选择了Java)编写它。我们必须使用两个不同的数据源和两个不同的视图,在我的例子中,oracledb和xml作为数据源,javaswing和JSF作为视图 根据Martin Fowler的《企业应用程序架构模式》一书,有三个主要层: 数据源层:我使用Hibernate ORM生成了实体,创建了数据访问
- hibernate.cfg.xml(hibernate的配置)
- hibernate.reveng.xml(hibernate的反向工程文件)
- isets.dao(包)
- isets.dao.hibernate(包)
- HBMCompationDAO.java(竞争实体的数据访问对象)
- isets.dao.xml(包)
- 。。。(其他实体的数据访问对象,存储为XML)
- isets.dao.hibernate(包)
- isets.entities(包)
- Competition.hbm.xml(生成的实体)
- Competition.java
- isets.util(包)
- HibernateUtil.java(获取会话工厂对象的文件)
非常感谢你的帮助。拜拜:-)域层通常意味着“实体”(域的模型)和域服务 实体持有与它们相关的所有业务逻辑。验证(检查它们是否处于正确状态)和计算通常放在属性setter/getter中,而转换数据的操作通过公共方法公开 域服务是与多个实体一起操作并在实体之间执行某些计算和/或转换的类 有些事情要考虑。为了使此设计能够正常工作(因此它是可测试的、解耦的等),必须使用依赖项注入()。域不应该为获取或保存数据等而烦恼。它应该被明确地解耦,并且它的所有依赖关系都应该预先知道
如果它是一个简单的应用程序,那么最好将域层和数据访问层结合起来,这样从ORM创建的对象就已经是实体了。只需添加域服务(如果需要)。然后在表示上也使用相同的实体(以及MVC模型)。这将减少映射器在ORM生成的对象(让我们称它们为DBO)、实体和表示所需的可能模型之间映射的需要。当然,如果每个层需要不同的对象,请务必创建它们。如果不需要的话,不要过于复杂 域层通常意味着“实体”(域的模型)和域服务 实体持有与它们相关的所有业务逻辑。验证(检查它们是否处于正确状态)和计算通常放在属性setter/getter中,而转换数据的操作通过公共方法公开 域服务是与多个实体一起操作并在实体之间执行某些计算和/或转换的类 有些事情要考虑。为了使此设计能够正常工作(因此它是可测试的、解耦的等),必须使用依赖项注入()。域不应该为获取或保存数据等而烦恼。它应该被明确地解耦,并且它的所有依赖关系都应该预先知道
如果它是一个简单的应用程序,那么最好将域层和数据访问层结合起来,这样从ORM创建的对象就已经是实体了。只需添加域服务(如果需要)。然后在表示上也使用相同的实体(以及MVC模型)。这将减少映射器在ORM生成的对象(让我们称它们为DBO)、实体和表示所需的可能模型之间映射的需要。当然,如果每个层需要不同的对象,请务必创建它们。如果不需要的话,不要过于复杂 一种可能性是按如下方式构造应用程序: 1) @Entity注释的POJO表示您的数据层,使用JPA表示表、表之间的关系等 2) 实现包装容器管理的CRUD操作的无状态会话bean。每个实体通常有一个外观,它们通常如下所示:
@Stateless
public class FooFacade extends AbstractFacade<Foo>{
@PersistenceContext
EntityManager em;
public EntityManager getEM() {
return em;
}
public void save (Foo entity) {
getEM.persiste(Foo.class, entity);
}
public void reload (Foo entity) {
getEM.refresh(entity);
}
//other similar stuff
}
@无状态
公共类FooFacade扩展了AbstractFacade{
@持久上下文
实体管理器;
公共实体管理器getEM(){
返回em;
}
公共作废保存(Foo实体){
持久化(Foo.class,entity);
}
公共无效重新加载(Foo实体){
getEM.refresh(实体);
}
//其他类似的东西
}
AbstractFacade是一个抽象类,提供遗传查找和其他在所有facade类中看起来相同的操作