gpt4 book ai didi

java - JPA ORM 的 Java DTO 的对象建模父/子关系

转载 作者:行者123 更新时间:2023-12-02 13:41:40 24 4
gpt4 key购买 nike

基于以下要求:

分别有两个端点,我使用 Spring 的 RestTemplate 客户端来使用和填充两个单独的 DTO。这部分已经完成。

http://www.endpoint.com/Advertisement

包含以下 JSON 数组:

[{"startDate":"2017-01-29","cost":"$50000.00","id":1112,"name":"Porsche"},{"startDate":"2017-03-06","cost":"$27000.00","id":38626,"name":"BMW"}]

http://www.endpoint.com/Metric

包含以下 JSON 数组:

[{"clicks":1796,"views":13582,"id":20275,"parentId":1112},{"clicks":3295,"views":12697,"id":18564,"parentId":38626}]

要求1:

两种数据之间的关系是父子关系,Advertisement是父级,Metric是子级。度量包含可用于描述父广告项的整体性能的度量数据。数据采用适当的格式后,将其本地保存到所选的数据库中。将数据存储在广告级别的数据库中。

要求2:

编写一个方法,对数据库执行查询以检索给定父广告的所有指标。接下来,根据指标 ID,在代码中仅使用一个数组(即就地删除重复项),返回一个仅包含唯一指标的数组。

要求3:

编写数据库命令/查询(使用您选择的数据库)来计算每个子指标的广告级别的总点击次数和浏览次数。在广告级别将这些值与每个广告对象一起存储。

所以,基本上,我开始这样的对象设计:

@Entity
public class AdvertisementDto {
@Id
@GeneratedValue
private Long id;

private String startDate;
private String cost;
private String name;

// Getter & Setters
}

@Entity
public class MetricsDto extends AdvertisementDto {

@Id
@GeneratedValue
private Long id;

private Long parentId;

private int clicks;

private int views;

// Getter & Setters
}

问题:

  1. 我关于父/子关系的 ORM 设计是否符合要求 1?

  2. 对我的对象设计是否适用于要求 # 2 和要求 # 3 感到困惑?

  3. 如何使用父类(super class) (AdvertisementDTO) 填充适当的父 ID?

最佳答案

对我来说,你确实有两个相互关联的实体。我还了解到,一则广告总是有一种指标,反之亦然。如果我是对的,你可以这样做:

@Entity
public class Advertisement {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="metrics_id")
private Metrics metrics;

private String startDate;
private String cost;
private String name;

// Getter & Setters
}

@Entity
public class Metrics {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@OneToOne(fetch=FetchType.LAZY, mappedBy="advertisement")
private Advertisement advertisement;

private int clicks;

private int views;

// Getter & Setters
}

为了保存、删除和查找,您需要使用 spring-data-style :

public interface AdvertisementRepository extends JpaRepository<Advertisement, Long> {

List<Advertisement> findAll();

}

public interface MetricsRepository extends JpaRepository<Metrics, Long> {

List<Metrics> findAll();
List<Metrics> findAllByAdvertisementId(@Param("advertisementId") Long advertisementId);

}

要了解如何最好地安排事情(在我看来)请看这里:https://github.com/khauser/microservices4vaadin/tree/master/microservices/userservice/src/main/java/microservices4vaadin/userservice

要计算总和,您需要朝这个方向做一些事情:

@Query("SELECT Coalesce(SUM(b.value),0) AS value "
+ "FROM Booking b INNER JOIN b.account a "
+ "WHERE a.itemId = :accountId "
+ " AND (b.bookingDate <= :toDate OR :toDate IS NULL)")
Double getAccountBalanceValue(@Param("accountId") Long accountId, @Param("toDate") @DateTimeFormat(iso=ISO.DATE) LocalDate toDate);

关于java - JPA ORM 的 Java DTO 的对象建模父/子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42713800/

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