gpt4 book ai didi

java - 在 Spring MVC 应用程序中将 DAO 对象转换为 DTO 对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:34 26 4
gpt4 key购买 nike

背景:我在教育环境中工作,去年夏天我们的一位开发人员使用 Spring MVC 和 Hibernate 设计并构建了一个 Java 网络应用程序。它在 9 月以新术语推出,取代了尘土飞扬的旧 Blackboard 插件,令用户非常高兴。这些应用程序的主要功能是为学生设定目标、给他们留言和为学生创建报告。

几个月过去了,原来的开发人员已经离开,应用程序正在经历一些成长的烦恼。

用例场景:教师登录后会看到他们的主屏幕,其中包含他们教授的类(class)列表,以及当前所选类(class)的目标、消息和报告的概述类(class)以及该类(class)的学生注册列表。如果类(class)包含少量目标等,则可以快速返回信息。但是随着信息量的增长,加载它所花费的时间似乎呈指数增长。

经过调查,我想我已经找到原因了。我参加了一个示例类(class)并查看了报告以了解发生了什么。我发现数据库以毫秒为单位返回相关数据,浏览器以毫秒为单位呈现它,但在浏览器等待从中返回数据时,两者之间有 12 秒。在数据库查询完成和前端接收响应之间对对象所做的唯一事情是转换为 DTO。

代码:这是报表对象在 DAO 层中的样子

@Entity
@Table(name = "REPORTS")
public class Report implements Serializable
{

/**
*
*/
private static final long serialVersionUID = -7659637777880535914L;

@Id
@GeneratedValue
@Column(name = "REPORT_ID", insertable = true, updatable = false, nullable = false, unique=true)
private Integer reportID;

@Column(name = "DATE_CREATED", insertable = true, updatable = false, nullable = false)
private GregorianCalendar dateCreated;

@Column(name = "DATE_MODIFIED", insertable = true, updatable = true, nullable = true)
private GregorianCalendar dateModified;

@Column(name = "TITLE", insertable = true, updatable = true, nullable = false, length=1000)
private String title;

@Column(name = "CURRENT_PERFORMANCE_GRADE", insertable = true, updatable = true, nullable = false)
private String currentPerformanceGrade;

@Column(name = "TARGET_GRADE", insertable = true, updatable = true, nullable = false)
private String targetGrade;

//VARCHAR(MAX) as this is the main body of the tutor report comments. Here the tutor can write as much content as they like.
@Column(name = "TUTOR_COMMENTS", insertable = true, updatable = true, nullable = false, columnDefinition="VARCHAR(MAX)")
private String tutorComments;
//getters and setters below
}

那里还有其他字段,例如报告链接到的用户、类(class)、编写报告的导师等。但为了简单起见,我在这里省略了它们。

public class ReportDTO implements Serializable
{

/**
*
*/
private static final long serialVersionUID = 2795129355073929139L;

private Integer reportID;

private String dateCreated;

private String dateModified;

private String title;

private String currentPerformanceGrade;

private String targetGrade;

private String tutorComments;
//getters and setters below
}

因此,与 GregorianCalendar 对象相反,日期对象已成为日期格式的字符串,因此主要区别在于日期的前端显示采用易于阅读的格式。下面是转换为 DTO 涉及的示例。服务层中的 Single 方法获取 DAO 对象,从中获取相关字段,将它们设置在新构造的 DTO 对象中,根据需要进行转换(例如公历到日期格式的字符串)并返回 DTO:

public ReportDTO convertToDto(Report daoReport) throws Exception
{

ReportDTO dtoReport = new ReportDTO();
try
{
if(daoReport.getReportID() != null)
{
dtoReport.setReportID(daoReport.getReportID());
}
if(daoReport.getDateCreated() != null)
{
dtoReport.setDateCreated(ReportServiceImpl.ISO_DATE_TIME_FORMAT.format(daoReport.getDateCreated().getTime()));

}

if(daoReport.getDateModified() != null)
{
dtoReport.setDateModified(ReportServiceImpl.ISO_DATE_TIME_FORMAT.format(daoReport.getDateModified().getTime()));

}

if(daoReport.getTitle() != null)
{
dtoReport.setTitle(daoReport.getTitle());

}
if(daoReport.getCurrentPerformanceGrade() != null)
{
dtoReport.setCurrentPerformanceGrade(daoReport.getCurrentPerformanceGrade());

}

if(daoReport.getTargetGrade() != null)
{
dtoReport.setTargetGrade(daoReport.getTargetGrade());

}

if(daoReport.getTutorComments() != null)
{
dtoReport.setTutorComments(daoReport.getTutorComments());

}
return dtoReport;
}
catch(Exception e)
{
Exception myException = new Exception("Exception was thrown while converting a persistent Report object to it's data transport equivalent", e);
throw myException;
}

问题:那么,毕竟,我的问题是,这是从 DAO 转换为 DTO 的正确方法吗?自从他离开后,我一直在遵循他的代码,任何新添加的东西都是以同样的方式完成的。在不转换对象的情况下将对象返回到前端,我在 >300 毫秒而不是 12 秒内看到了结果。

我知道他从 here 学习了 Spring MVC对于这个项目,他不是经验丰富的 Spring 开发人员,我也不是,从我们看到如此大的请求时间这一事实来看,我们一定是做错了什么。

最佳答案

好的,正如 beny23 提到的,Hibernate 是延迟加载的(最初加载 PK 列表,然后在对数据执行某些操作时加载其余部分)

我使用的解决方案是创建一个非 hibernate 连接来使用普通 JDBC 连接读取数据,查询还转换了数据,以便它以我需要的格式(日期作为字符串等)返回,所以和我不必转换为 dto。通过这种方式,我将一些工作卸载到数据库中,并使我的应用程序免于执行此操作的麻烦。

关于java - 在 Spring MVC 应用程序中将 DAO 对象转换为 DTO 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14442639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com