java - 每个实体的 DTO 对象

标签 java entity-framework design-patterns jpa dto

我继承了一个用 Java 编写的应用程序,该应用程序使用 JPA 访问数据库。该应用程序使用了我以前从未遇到过的设计模式,我真的会就为什么使用此模式提供一些指导。与许多应用程序一样,我们有前端、中间件和后端数据库。通过 DAO 访问数据库。 DAO 上的每个方法都会加载一个实体 DTO,它只是一个 POJO,只有 getter 和 setter,然后将该实体 DTO 传递到具有其他更改实体状态的方法的实体本身。示例[更改类名以保护无辜者]

enum Gender
{
    Male,
    Female
}

class PersonDTO
{
    private String mFirstName;
    private String mLastName;
    private Gender mGender;
    ...

    String getFirstName() { return this.mFirstName; }
    String setFirstName(String name) { this.mFirstName = name; }
    // etc
}

class Person
{
    PersonDTO mDTO;
    Person(PersonDTO dto)
    {
        mDTO = dto;
    }

    String getFirstName() { return mDTO.getFirstName() }
    String setFirstName(String name) { mDTO.setFirstName(name); }
    // and so on

    void marry( Person aNotherPerson )
    {
        if( this.getGender()==Gender.Female && 
               aNotherPerson.getGender()==Gender.Male)
        {
            this.setLastName( aNotherPerson.getLastName() );
        }
        aNotherPerson.marry( this );
    }
}

这在 30 个左右的实体类中重复,通过 DTO 翻倍到 60 个,我就是不明白为什么。我了解(位)关于转换的分离,我也了解(位)关于基于 EAO 的设计与基于 Activity 记录的设计之间的差异。

但是事情真的需要走到这一步吗?是否应该始终存在至少一个“DB”对象,除了映射到数据库字段的 getter 和 setter 之外什么都不包含?

最佳答案

免责声明:关于这个主题有不同的观点,并且根据您的系统架构,您可能没有选择。

话虽如此......我以前见过这种模式的实现,但不是它的忠实粉丝,在我看来,它重复了大量的代码,而没有增加任何实际值(value)。它似乎在具有 XML API(例如 SOAP)的系统中特别流行,在这些系统中,将 XML 结构直接映射到对象结构可能很困难。在您的特定情况下,情况似乎更糟,因为在重复的 getFirstName()/getLastName() 方法之上,有业务逻辑(属于服务层)直接编码到 pojo (这应该是一个简单的数据传输对象)如 DTO)。为什么pojo应该知道只有异性才能结婚?

为了帮助更好地理解原因,您能否解释一下这些 DTO 从何而来?是否有前端将数据提交到 Controller ,然后将其转换为 DTO,然后使用 DTO 来填充数据?

关于java - 每个实体的 DTO 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21588390/

相关文章:

Java类接口(interface)设计题

multithreading - 我的 “design pattern”用于异步方法好吗?

在 "try" block 中抛出的 Java 异常无法在 "try...catch"之外捕获

java - 使用 Java 9 使 Ropeytask 崩溃

java - 使用嵌入式 API 向节点添加标签

mysql - Entity Framework 逆向工程代码优先可以与 MySql 一起使用吗?

c# - EF 迁移应该去哪里,我的类库项目还是我的 ASP.NET 项目?

java - OpenGL - 颜色布局位置不起作用

c# - LINQ to SQL 中的堆栈溢出异常

c++ - 扩展通用功能