有人可以描述表数据网关(TDG)和数据访问对象(DAO)之间的主要区别吗?
TDG可以操作该表的所有行,但DAO也可以(DAO可以保存、删除指定对象,也可以对整个表进行操作)
问候
关于设计合适的 DAO 的讨论总是如此流行,其结论总是“DAO 应该只执行简单的 CRUD 操作”。
那么执行聚合等操作的最佳位置是什么?DAO 是否应该返回类似于数据源架构的复杂对象图?
假设我有以下 DAO 接口:
public interface UserDao {
public User getByName(String name);
}
Run Code Online (Sandbox Code Playgroud)
这是它返回的对象:
public class Transaction {
public int amount;
public Date transactionDate;
}
public class User {
public String name;
public Transaction[] transactions;
}
Run Code Online (Sandbox Code Playgroud)
首先,我认为如果 DAO 所做的只是 CRUD 操作,那么它会返回一个标准值对象。
所以现在我已经通过 DAO 建模来返回基于数据存储关系的东西。它是否正确?如果我有更复杂的对象图怎么办?
更新:我想我在这一部分中要问的是,DAO 的返回值(无论是 VO、DTO 还是任何您想要的名称)是否应该按照数据存储的数据表示进行建模?或者我应该引入一个新的 DAO 来获取用户的交易,并为 UserDAO 拉取的每个用户调用 TransactionDAO 来获取它们?
其次,假设我想对用户的所有交易执行聚合。使用这个 DAO,我可以简单地获取一个用户,并在我的服务循环中遍历事务数组并自己执行聚合。毕竟,说这样的聚合是属于服务的业务规则是完全合理的。
但如果用户的交易数量达到数万怎么办?这会对应用程序性能产生负面影响。在 DAO 上引入一种执行上述聚合的新方法是否不正确?
当然,这可能是假设 DAO 由数据库备份,我可以在其中编写简单的 SELECT SUM() 查询。如果 DAO 实现更改为平面文件或其他内容,我无论如何都需要在内存中进行聚合。
那么这里的最佳实践是什么?
我在我的业务对象中定义了一个枚举。
该枚举虽然是在数据传输对象中定义的。
dto 枚举不是业务对象的类型,因为它们不应该互相了解。
当我现在从客户端获取此 dto 并将 dto 映射到业务对象并将数据插入数据库时,我想断言传递的 dto.enum 具有与数据库中插入的枚举值相同的值。
这是我收到的错误消息:
Expected: A
But was: A
Run Code Online (Sandbox Code Playgroud)
实际上它们具有相同的值但不同的类型:dto.enum 与businessobject.enum。
那么你会在哪里定义这个枚举,那么两个对象都可以它并且两个对象彼此之间没有耦合?
我考虑在我的业务层和 dto AND 业务对象使用的枚举定义中放置一个额外的 C# 类,以便断言能够工作。
你会怎么办?
我有一个有趣的 JSON 解析问题,至少对我来说是这样,因为我是第一次这样做。我有以下示例 JSON,我想将其映射到等效的 DTO:
{
"modules":
[
{
"name":"module1",
"shortId":23425,
"pmns":
[
{
"name":"pmn1",
"position":1,
"pmnType":"D3"
},
{
"name":"pmn3",
"position":3,
"pmnType":"R2"
},
{
"name":"pmn7",
"position":5,
"pmnType":"S1"
},
]
},
{
"name":"module2",
"shortId":1572,
"pmns":
[
{
"name":"pmn1",
"position":3,
"pmnType":"D3"
},
{
"name":"pmn12",
"position":35,
"pmnType":"R2"
},
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是我的 ModuleDTO 类:
public class ModuleDTO {
private String _name;
private short _shortId;
private PmnDTO[] _pmns;
public String getName() {
return _name;
}
public short getShortId() {
return _shortId;
}
public …
Run Code Online (Sandbox Code Playgroud) 使用:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.5.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>1.5.8.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
这是我的 DTO。它不是数据库上的实体。我只想用它来绘制地图
public class PoolStateResult {
private Integer totalCodes;
private Integer assignedCodes;
private Integer availableCodes;
private Date startDateValidate;
private Date endDateValidate;
constructors
getters and setters
Run Code Online (Sandbox Code Playgroud)
这是DAO的内容
Query q = em.createNativeQuery(" SELECT p.start_validity_date as startDateValidate, "
+ " p.end_validity_date as endDateValidate, "
+ " (SELECT count(*) from POOL_CODES p WHERE …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在打字稿中实现态射/DTO 映射概念。
\n\n简要概述态射的概念,态射是指从一种数学结构到另一种数学结构的结构保持映射。\n具有源 X 和目标 Y 的态射 f 写作 f : X \xe2\x86\x92 Y。
\n\n更多关于https://en.wikipedia.org/wiki/Morphism
\n\n我正在尝试使用态射的 StrictSchema 以通用方式进行复杂类型对象(即包含另一个对象和对象数组的对象)的源到目标映射。请参阅下面提供的链接以获取有关 morphism npm 包的更多信息。\n https://github.com/nobrainr/morphism
\n\n我的界面
\n\n interface IFoo { \n keyA: {\n key1: number,\n key2: number,\n key3: [\n {\n key3A: string,\n key3B: number\n }\n ],\n key4: string\n },\n keyB: string,\n keyC: number,\n keyD: {\n key1: string,\n key2: {\n key2A: string\n },\n key3: string\n },\n keyE: string\n }\n\n\n const schema: StrictSchema<IFoo> = \n { keyA: {\n key1: \'somepath\',\n …
Run Code Online (Sandbox Code Playgroud) 我正在考虑使用 DTO 投影 - 我有两个具有一对多关系的实体(EntityOne 的一个实例链接到 EntityTwo 的多个实例),并且我想将结果作为新的 DTO 对象返回 - 我的内容我目前正在尝试的是这样的:
query.select(Projections.constructor(MyDtoObject.class,
entityOne, list(entityTwo)))
.from(entityOne, entityTwo)
.where(......)
Run Code Online (Sandbox Code Playgroud)
MyDtoObject 看起来像这样:
public class MyDtoObject {
private EntityOne entityOne;
private Collection<EntityTwo> entityTwoCollection
// getters, setters and an all args constructor method here
}
Run Code Online (Sandbox Code Playgroud)
然而,这会带回比预期多得多的 MyDtoObjects,而且看起来每个 MyDtoObjects 只保存一个entityTwo 对象而不是一个集合。
如何指示 queryDSL 创建具有多个entityTwo 条目的 MyDtoObjects 结果对象?list(..) 方法在我上面的场景中是否执行任何操作?
当我在 api 文档的模型中使用 Dto 时,Dto 的名称记录如下,Customer: 01d691680190c1b19dfee75af0f2e292,可以将此名称自定义为 Customer: Input 或其他任何名称。
这是我的资源配置:
App\Entity\Customer\Customer:
collectionOperations:
register:
method: POST
path: /register
controller: App\Controller\ShopApi\Customer\RegisterCustomerAction
input:
class: App\Dto\RegisterCustomerRequest
name: RegisterCustomerRequest
itemOperations:
get:
normalization_context:
jsonld_embed_context: true
groups: ['customer:read']
swagger_definition_name: CustomerResponse
Run Code Online (Sandbox Code Playgroud)
但是后来在 api doc 中我得到了一个模型:
Customer:01d691680190c1b19dfee75af0f2e292 {
email* string
plainPassword* string
firstName* string
lastName* string
gender* string
identificationNumber* string
typeIdentificationNumber* string
subscribedToNewsletter boolean
confirmTermsConditions boolean
addressAlias string
address* string
countryCode* string
provinceCode string
provinceName string
city* string
postcode* string
phoneNumber* string }
Run Code Online (Sandbox Code Playgroud) 我有一个 User 实体和一个 Role 实体。除了 User 实体具有对应于其各自角色的 id 的 role_id 字段这一事实之外,这些字段并不重要。由于 Spring Data R2DBC 不会在实体之间建立任何形式的关系,因此我转向 DTO 方法。我对 R2DBC 和响应式编程非常陌生,我一生都无法弄清楚如何将Flux<User>
我的存储库的 findAll() 方法返回到Flux<UserDto>
. 我的 UserDto 类非常简单:
@Data
@RequiredArgsConstructor
public class UserDto
{
private final User user;
private final Role role;
}
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试创建的 UserMapper 类:
@Service
@RequiredArgsConstructor
public class UserMapper
{
private final RoleRepository roleRepo;
public Flux<UserDto> map(Flux<User> users)
{
//???
}
}
Run Code Online (Sandbox Code Playgroud)
如何让这个映射器将 aFlux<User>
转换为Flux<UserDto>
包含用户各自角色的 a ?
谢谢!
java dto reactive-programming project-reactor spring-data-r2dbc
我对 mapstruct 中的 @ManyToOne 映射有疑问。我有两张桌子
第一个:
@Entity
@Table(name = "members", schema = vsm)
public class MemberEntity{
@Column(name = "id", nullable = false)
protected Long id;
@ManyToOne(optional = false)
@JoinColumn(name = "case_id", nullable = false)
private CaseEntity case;
}
Run Code Online (Sandbox Code Playgroud)
第二个:
@Entity
@Table(name = "cases", schema = vsm)
public class CaseEntity {
@Column(name = "id", nullable = false)
protected Long id;
@Column(name = "description", nullable = false)
protected String description;
}
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的案例:
public class CasesDto{
protected Long id;
protected String description;
private …
Run Code Online (Sandbox Code Playgroud)