何时使用实体(Entity)和数据传输对象(DTO)?

3

我正在使用SpringBoot中的Apache Beam,并使用JDBCIO在.query中从“customer”表(select * from records.customer where customer_code =“abc”)中检索记录。那么这个“customer”类应该是一个实体还是DTO?

我的理解是只有在使用存储库时才需要实体。如果我错了,请纠正我。

2个回答

1

根据您的领域,您可以使用其中任何一个。 实体用于与您的领域范围一起使用。它适用于“行为”。 数据传输对象(DTO)用于将数据从一个进程/模块传输到另一个。


1

在处理 JPA 存储库时,您会使用 Entity。需要记住的是,Entity 基本上是对数据库的表示,因此例如在 Hibernate(JPA 实现)中,您对 Entity 数据进行的每个更改都将在某个时刻持久化到数据库中。这可能正是您所需的,也可能不是,您必须保持谨慎。想象一下,在两个不同的Service类之间共享Entities,其中一个类对其进行更改,可能会产生副作用。这通常是错误的来源。

DTO(数据传输对象)通常用于通过 REST API 公开您的 Entities。如果您使用 Entity 本身,则在 Jackson 尝试将对象序列化为 JSON 时可能会遇到麻烦。您也可以看到实际使用 DTO 在 Services 之间进行通信的代码。这通常会减少漏洞的可能性(如前面所述),但也会使您的代码更加复杂,并可能使实现某些用例变得困难。


谢谢你提供这个好回答。我只是想知道当Jackson尝试序列化一个实体时我们如何会遇到麻烦,我很愿意听更多关于此的信息。 - Moritz Kampfinger
1
问题在于当Jackson尝试序列化对象时,它将需要与之关联的所有对象。想象一下,您有一个Class A对象,其中包含一个Class B属性,该属性在不同的表中进行建模。如果您的关联是延迟加载的(意味着当您查询数据库时,您不会获取整个对象图,而只有在您需要时才获取),则当Jackson尝试序列化Class A对象时,您可能会遇到问题,因为此时您可能无法从数据库中获取所需的内容,因为该请求的会话已经结束了。 - João Dias
你可以在这里找到更多的细节 --> https://www.baeldung.com/hibernate-exceptions#initialization。 - João Dias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接