设计一个具有延迟加载属性的 Java POJO

2023-12-13

请考虑下面的例子:

Web 应用程序为每个登录用户创建一个用户对象。这个对象有简单的String属性为firstName, lastName ...

每个用户都可以拥有一个car也。考虑获取用户car非常昂贵,因此我们不希望在用户登录时设置用户的汽车。相反,我们希望在用例需要时获取汽车。

为了实现这一点,我们创建了一个用户 pojo:

public class User() {
  private String FirstName;
  private String LastName;   
  private Car car;
  //Here we have the service object, this could be injected with spring or JEE
  private CarServices carServices;

  public Car getCar() {
    //If the car is not fetched yet, go on and get it from your service
    if (car == null) {
      car = carServices.getCarFromDB(...)
    }
    return car;
  }

}

登录后的初始用户:

User newUser = new User();
newUser.setFirstName("foo");
newUser.setLastName("bar");
//We just let user have service, so he can use this service latter
newUser.setCarServices( new CarServices() );

每个需要用户汽车的用例都可以轻松获得:

newUser.getCar()

然而,有人认为,通过这种方式,我的 User 对象不再是一个简单的 pojo,这不是一个好方法。

我怎样才能更好地实现这个要求。


有人认为,通过这种方式,我的 User 对象不是一个简单的 pojo

为了回答你的问题,我首先想回顾一下历史。

波乔是一个普通的旧java对象并意味着您只使用“标准”java。这个术语是在 J2EE 大肆宣传的时候创建的。此时,开发人员在企业 Bean 中编写业务逻辑,而 EJB 需要大量基础设施代码。这一事实将业务逻辑与实现技术结合起来。因此,Rebecca Parsons、Josh MacKenzie 和 Martin Fowler 得出的结论是,如果只使用标准 java,业务逻辑将更具可重用性并且更易于测试。因此他们创造了这个词pojo,因为开发人员喜欢花哨的名字。

Your User类仅依赖于标准 java,因此这是一个pojo.

一些开发人员认为 pojo 不应该包含任何逻辑。这些开发人员更喜欢贫血模型。其他人则认为丰富的模型是更好的方法。我属于那些更喜欢丰富模型而不是贫乏模型的开发人员。

如果您想删除CarServices依赖于User类你可以实现一个Car延迟加载代理就像 hibernate 或 jpa 实现一样。

至少这里是我对 beans、pojos、贫血和丰富领域模型的一些想法。

  • pojos和java beans的区别
  • 贫乏领域模型与丰富领域模型

希望它在您与其他开发人员讨论时对您有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计一个具有延迟加载属性的 Java POJO 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • Chrome 扩展 API:后台页面上的 chrome.tabs.captureVisibleTab 到内容脚本

    我的总体目标是使用以下方法通过后台页面截取屏幕截图 http developer chrome com extensions tabs html method captureVisibleTab 并将其传递给内容脚本 以便我可以使用页面的
  • 如何以编程方式读取 C# 中的本机 DLL 导入?

    如何以编程方式分析本机 DLL 以读取其导入 编辑 我原来的问题如下所示 以及大量有缺陷的代码 请参阅下面的答案以获得更正确的代码 C 代码位于这个链接旨在打印本机 DLL 的导入 我发现当我使用原始示例的目标 MSCOREE DLL 运行
  • 使用两种不同的混淆器处理相同的.NET程序集[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 使用两种不同的混淆器处理相同的 NET 程序集 将一个程序集的输出作为输入提供给另一个程序集 会增加使反编译变得不可能的机会吗 Thanks 反编译从来都不是不可能的 不过 当前的工具可能
  • Windows 10 中 Python 3.7 中的 pip install 索引器错误

    我正在尝试在 Python 3 7 中使用 Jupyter 笔记本安装索引器 pip install indexer 我收到以下错误 Collecting indexer Using cached https files pythonhos
  • 第一个最后一个元素

    XSLT XML 问题 研究一个简单的转换 我有简单的索引 xml 输入 我必须为每章输出第一个和最后一个元素 如下所示 任何帮助都感激不尽 问候 JJ Input
  • SHGetPropertyStoreForWindow - 如何设置现有 System.AppUserModel.ID 的属性

    所以我通过以下方式将窗口从主选项卡组中分离出来IPropertyStore via SHGetPropertyStoreForWindow像这样 IPropertyStore SetValue pps PKEY AppUserModel I
  • Azure ML 和 Azure ML 实验之间的区别

    我是 Azure ML 的新手 我有一些疑问 有人可以澄清下面列出的我的疑问吗 Azure ML 服务和 Azure ML 实验服务之间有什么区别 Azure ML 工作台和 Azure ML Studio 之间有什么区别 我想使用 azu
  • 编辑控件不生成 WM_COMMAND 消息

    我有一个编辑控件 在父窗口中我正在听WM COMMAND信息 但我的控件不会在更改时发送它 此外 当我使用 Spy 观看消息时 我只能在编辑控件本身上看到不同的键盘消息 并且主父窗口中的唯一消息是WM CTLCOLOREDIT P S 我正
  • 如何在TabView的选项卡之间发送信号(Qt5)

    我有带有两个选项卡的 TabView 每个选项卡都有 Item 元素 其中包含其他内容 我需要从一个选项卡发送信号并在其他选项卡中捕获 处理 它 如果我尝试将信号从一个选项卡 项目 发送到另一个选项卡 它不起作用 并且不会显示任何错误 我找
  • React Noob - onChange 元素失去焦点

    我正在尝试创建一个基本的登录页面 该页面接受用户凭据并将其提交到登录 api 问题是当onChange事件触发 设置用户凭据 元素失去焦点 我不应该更新凭证吗onChange import React Component PropTypes
  • 显示来自 GridFS 的 HTML 图像

    我正在 GridFS 中上传图像 但不知道如何在 img tag 我尝试了以下代码 conn once open function var gfs Grid conn db mongoose mongo gfs files find fil
  • WiX v3 安装项目,无法通过应用程序和功能卸载

    我很难弄清楚是什么导致了这个奇怪的问题 因此 我按照 WiX v3 安装项目文档创建了一个非常基本的 msi 几乎只是提供的模板 但无论我尝试什么 每当我通过 Windows 10 卸载它时Apps Features界面 我不断收到这个 但
  • Typescript如何使用稍后指定的泛型类型?

    首先 这是我第一次用CodeSandbox来创建一个简化的例子 欢迎任何有关如何改进这一点的建议 问题 我想介绍动物的事实 有些事实是所有动物共有的 而另一些则是动物特有的 在我的主要组件中App 我还不知道类型 所以我想保留它的通用性An
  • 通过 AlarmManager 设置不精确的警报时会有多少延迟? [复制]

    这个问题在这里已经有答案了 使用时AlarmManager要设置闹钟 除非您设置了精确的闹钟 否则可能会出现延迟 在指定时间之后的某个时间触发闹钟 是否可以保证延迟的范围是多少 我想成为一名负责任的开发人员 如果延迟不超过 例如 一分钟 则
  • 在iphone中的uiwebview中显示文本

    我想在 uiwebview 中显示文本数据 有人可以指导如何做同样的事情 使用 UIWebViews loadHTMLString 方法 void loadHTMLString NSString string baseURL NSURL b
  • 在 SQL 中使用变量模式持久保存复杂类型的最有效方法

    我在做什么 我正在创建一个 SQL 表 它将为复杂类型的对象提供后端存储机制 我正在尝试确定如何以最佳性能实现这一目标 我需要能够查询复杂类型的每个单独的简单类型值 例如 地址复杂类型中城市的字符串值 我原本以为可以将复杂类型值作为 XML
  • Eclipse 告诉我一个方法未定义,而实际上它已明确定义

    我正在 RAD 7 5 中工作 我正在将一个包从一个 Web 项目导入到另一个 Web 项目中 我实例化该类并尝试使用其方法之一 但出现该方法未定义的构建错误 该方法是公开的 除此方法外 所有其他方法均有效 我从中导入的项目已正确构建 我尝
  • 正则表达式 - 以特定字符串开头但不以另一个子字符串结尾

    给定两个字符串s1 and s2 我正在尝试编写一个正则表达式来匹配以s1但不以s2 示例 s1 测试 s2 坏 TEST 101比赛 测试一些 DESC 匹配 TEST 101 BAD 不应匹配 TEST SOME DESC BAD 不应
  • 无法让 Elasticsearch 与 Django 一起使用

    我正在尝试在 Ubuntu 14 04 上使用 Django 和 Haystack 以及 Elasticsearch 作为后端 我安装了 Elasticsearch 和 Haystack 运行 python manage py runser
  • 设计一个具有延迟加载属性的 Java POJO

    请考虑下面的例子 Web 应用程序为每个登录用户创建一个用户对象 这个对象有简单的String属性为firstName lastName 每个用户都可以拥有一个car也 考虑获取用户car非常昂贵 因此我们不希望在用户登录时设置用户的汽车