Java 三层系统中的业务逻辑应该放在哪里?

Java 三层系统中的业务逻辑应该放在哪里?,java,swing,hibernate,jsf,Java,Swing,Hibernate,Jsf,我知道关于我的问题有很多问题,我读了很多书,但我仍然觉得有点愚蠢,因为我还没有理解。所以我正在我的特殊问题上尝试 我正在执行学校的工作。它应该是信息系统的一部分,必须分层。我们必须用Java或C(我选择了Java)编写它。我们必须使用两个不同的数据源和两个不同的视图,在我的例子中,oracledb和xml作为数据源,javaswing和JSF作为视图 根据Martin Fowler的《企业应用程序架构模式》一书,有三个主要层: 数据源层:我使用Hibernate ORM生成了实体,创建了数据访问

我知道关于我的问题有很多问题,我读了很多书,但我仍然觉得有点愚蠢,因为我还没有理解。所以我正在我的特殊问题上尝试

我正在执行学校的工作。它应该是信息系统的一部分,必须分层。我们必须用Java或C(我选择了Java)编写它。我们必须使用两个不同的数据源和两个不同的视图,在我的例子中,oracledb和xml作为数据源,javaswing和JSF作为视图

根据Martin Fowler的《企业应用程序架构模式》一书,有三个主要层:

  • 数据源层:我使用Hibernate ORM生成了实体,创建了数据访问对象,以实现更简单的“接口”来获取数据
  • 域层:
  • 表示层:我已经用MVC逻辑创建了Swing GUI和一些.xhtml页面
  • 如果系统中没有任何“计算”,而只有简单的获取和返回数据,我就完成了,一切都正常。但我正在实施这个系统,它应该管理体育舞蹈比赛,在比赛期间,我需要为每一轮生成一组舞伴,比赛结束后,我需要计算每个舞者的分数,必要时增加分数,等等

    我知道,这是域层(业务逻辑)的责任,但在我的代码中,它在哪里?我应该为这些对象选择什么名称,以及将它们放在代码结构中的什么位置

    我的结构:

    • hibernate.cfg.xml(hibernate的配置)
    • hibernate.reveng.xml(hibernate的反向工程文件)
    • isets.dao(包)
      • isets.dao.hibernate(包)
        • HBMCompationDAO.java(竞争实体的数据访问对象)
      • isets.dao.xml(包)
        • 。。。(其他实体的数据访问对象,存储为XML)
    • 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类中看起来相同的操作