获取子栏目方法应该放在Entity还是Service层?

大佬们,我想写个获取子栏目的方法,这个写在entity(po)里合适吗?还是写到service里或其他什么地方?

目前写在了实体类里(entity?po?domain?)
Cat.java

package com.test.blog.pojo.po;

import java.util.List;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.activerecord.Model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 栏目实体类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Cat extends Model<Cat> {
    // 配置主键为自增类型
    @TableId(type = IdType.AUTO)
    private Integer catid;
    private String catname;
    private Integer pid;
    private String title;
    private String description;
    private Integer sortid;
    private Short pagesize;

    // 获取子栏目
    public List<Cat> getChildren() {
        QueryWrapper<Cat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("pid", this.catid);
        List<Cat> list = selectList(queryWrapper);
        return list;
    }
}
阅读 769
avatarAI BotBETA

答案:

获取子栏目的方法应该放在Service层,而不是Entity层。

解释:

在典型的分层架构中,Entity(实体)层通常只包含数据的表示,即属性和与之相关的getter和setter方法。它们不应该包含任何业务逻辑或数据访问逻辑。这样做是为了保持实体类的简单性和可重用性,并且避免在多个地方重复相同的业务逻辑。

Service层是处理业务逻辑的地方,它应该包含与业务相关的操作和计算。在这个例子中,获取子栏目是一个业务操作,因为它涉及到根据某个条件(这里是父栏目ID)从数据库中检索数据。因此,这个操作应该放在Service层中。

将获取子栏目的方法放在Entity类中会导致几个问题:

  1. 耦合性增强:Entity类现在与MyBatis Plus的QueryWrapper和数据访问逻辑紧密耦合,这违反了单一职责原则。
  2. 测试困难:如果你需要在没有数据库连接的情况下测试Entity类,包含数据访问逻辑的方法会使测试变得更加复杂。
  3. 可维护性降低:如果以后需要更改数据访问逻辑或添加额外的业务逻辑,将不得不修改Entity类,这可能会影响到其他使用这个类的代码。

因此,建议将getChildren()方法移动到Service层,并在Service类中注入MyBatis Plus的Mapper或DAO来进行数据访问。这样,Entity类可以保持简单和纯净,而Service层可以处理所有与业务相关的逻辑。

1 个回答

两种写法都可以,取决于项目设计。

从面向对象的角度出发,写在Entity中是对的。毕竟Java是面向对象的语言 :)

但是就常见的项目实践来说,一般是写在Service层。说到底现在的项目还是面向接口编程居多,而且考虑到MyBatis-Plus在项目中的应用,很多项目会使用覆盖式策略自动生成Entity层的实体类对象代码,如果把getChilgren方法写在Entity层,一但数据库调整导致刷新Entity层代码,很可能导致这些自定义的方法被覆盖删除,导致项目报错。

综上,如果是面向对象的实践项目或者自己用的小项目,自己喜欢就好,写在Entity会更符合语义。如果是团队项目,建议配合团队项目规范,通常是后者。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题