java - 业务层是否应该将持久化对象返回给UI层?

标签 java spring jpa orm separation-of-concerns

假设我有一个 POJO 类 Meal 。该类使用 ORM(例如 JPA + Hibernate)进行映射,因此我可以将其保存在数据库中。除此之外,该类包含 List<Dish> dishes (Dish 是另一个映射的 POJO)由 ORM 延迟加载。

现在我有一个业务层方法Meal getNextDueMeal() 。这由 UI 层调用,然后向用户显示餐食。当然,组成餐点的菜肴也应该展示出来。

但是我该怎么处理这个问题呢?如果我尝试迭代 getMeals() 返回的列表天真地,我会得到一个 LazyInitializationException 。我可以维护 EntityManger在 UI 层,例如通过使用 Spring 的 @Transactional注解。但是,从业务逻辑返回的对象将保持持久性,即如果我以某种方式修改 Meal - UI 中的“POJO”,一旦我从@Transactional返回,它就会自动保存。 -方法,这可能不是我想要的。

tl;dr:业务层是否应该将持久对象返回给UI层?如果没有,我该如何处理延迟加载?

最佳答案

当您使用远程接口(interface)时,将实体作为业务层返回值返回并不是一个好主意。您可以定义一些DTO数据传输对象,并从获取的实体中填充它们,并将这些 DTO 作为返回值返回。

Should the business layer return persistent objects to the UI-Layer? And if not, how do I deal with lazy loading?

关于延迟加载,您可以将业务层中所有必需的值填充到 DTO 对象中,因此,在您的 UI 层中,所有必需的属性都已加载,并且您不会遇到那些LazyInitializationException异常。

它是如何工作的?


引用自PoEAA :

The fields in a Data Transfer Object are fairly simple, being primitives, simple classes like Strings and Dates, or other Data Transfer Objects. Any structure between data transfer objects should be a simple graph structure—normally a hierarchy—as opposed to the more complicated graph structures that you see in a Entity.

就您而言,您可能会有一个 MealDto 和一个 DishDto,如下所示:

public class MealDto {
    private String name;
    private List<DishDto> dishes;

    // getters and setters
}

您可以使用另一个抽象负责从相应的实体组装 DTO。例如,您可以使用 MealAssembler:

public class MealAssembler {
    public MealDto toDto(Meal meal) {
        MealDto dto = new MealDto();
        dto.setName(meal.getName);
        // populate the other stuff    

        return dto;
    }
}

关于java - 业务层是否应该将持久化对象返回给UI层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36117258/

相关文章:

java - 系统清除属性不起作用。怎么会这样?

java - 对 Hadoop Map-Reduce 应用程序进行基准测试

java - 创建一个新对象并调用方法 spring 配置

java - 在 JSF 项目中包含 JPA 项目

java - GAE/JPA/Datastore 如何查询无主列表

java - 在java代码中设置代理用户名和密码

java - 谷歌云存储: 401 unauthorized error

java - spring boot 中的多个 liquibase 配置

javascript - 如何根据服务器响应而不是 HTTP 500 触发 jquery.ajax() 错误回调?

java - 如何将我的 Web 应用程序同步到我的数据库?