【问题标题】:Spring Boot Update at 2 Classes at the same timeSpring Boot 同时更新 2 个类
【发布时间】:2020-07-16 16:01:14
【问题描述】:

我用 spring boot 启动一个项目,我使用一个有 6 个表的数据库。 这是一个 CRUD 应用程序。

所以,我有 5 个表的实体/dto/service/controller/repository 包。 (SQL 中有 6 个表)

现在,我想将实体 x 的表 x(SQL) 列上的一行更新为特定行的另一个实体 y。

在我看来,应该在create X的服务层做,但是怎么做呢?

我应该使用来自 2 个实体的数据创建 xyDTO 吗?我害怕这样做,它不会自动更新表 y。但是在创建 xyDTO 时。我不想要这个。

如何将特定 DTO x 的数据同时更新到另一个 DTO y(SQL 的第 6 表)

我在网上找不到类似的例子。谁能帮帮我?

我的代码:

@Entity
@Table(name = "repo")
public class Repo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    Long id;

    @Column(name="stock")
    private Long stock;
}

@Entity
@Table(name = "voucher")
public class Voucher {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "quantity")
    private BigDecimal quantity;
 
    @Column(name = "type")
    private boolean type;
}

@Service
public class VoucherService{
    @Override
    public Voucher dtoToEntity(VoucherDTO dto) {
        Voucher voucher = new Voucher();
        voucher.setId(dto.getId());     
        voucher.setDescription(dto.getDescription());
 
        List<VoucherProduct> voucherList = new ArrayList<>();
    
        for (VoucherProductDTOMini inv : dto.getVoucherproducts()) {
            VoucherProduct voucherL = voucherProductService.DTOtoEntity(inv);        
            voucherList.add(voucherL);
        }
    
        voucher.setVoucherproducts(voucherList);
        return voucher;
    }
    
    @Override
    public VoucherDTO createVoucher(VoucherDTO voucherDTO) {
        Voucher voucher=new Voucher();
        voucher=voucherRepository.save(voucher);

        VoucherDTO voucherDTOnew=new VoucherDTO(voucher);
        return voucherDTOnew;
    }
}

我应该 检查我的凭证类型(真实),我应该在我的回购实体中添加 库存。

我可以通过哪种方式同时更新两个实体?

当我添加真正的凭证时,我应该在我的repo.stock 上添加voucher.quantity 的数据。

【问题讨论】:

  • 请更好地澄清您的问题,因为很难理解您要做什么。如果您尝试更新外键列,请直接提及。此外,最好为您的实体提供您的代码,以便我们了解您的数据库中的关系。
  • 基本上流程应该是这样的:获取你需要更新的实体 (让Hibernate处理所有的查询和延迟加载) -> 更改你想要的属性 -> 保存
  • 非常感谢您的时间和提示。我在帖子中添加了一些代码,它可能会有所帮助。

标签: java spring spring-boot rest dto


【解决方案1】:

首先,我想在您的代码中强调几点:

  1. 我找不到在您的服务中的这些方法上使用 @Override 注释的原因。
  2. createVoucher 方法中创建完全空的实体,这不是一件好事。

DTO 代表数据传输对象,通常在 Spring 应用程序中用于将数据传输服务。例如:控制器。例如,当用户发出 Http 请求 以接收所有 Voucher 时,您希望返回 VoucherDto 仅包含您希望用户看到的那些字段.

您可以使用不同的 DTO 对象来获取实体值并更新它们。因为有时您希望允许用户仅更新某些属性。


回答您关于如何在一次调用中更新两个实体的问题。据我了解您的问题,您想通过单个请求更新两个不同实体中的不同属性。这是可能的,尽管有不同的方法。

  1. 创建两个不同的 DTO,每个实体一个。创建两个不同的 Http 请求,每个都需要一个 DTO 并调用服务中的方法来更新每个 Entity例如VoucherController.updateVoucher -> VoucherService.updateVoucherRepoController.updateRepo -> RepoService.updateRepo。我个人更喜欢将此作为解决方案,因为您的实体 VoucherRepo 没有任何关系。
  2. 创建一个单一的DTO对象,包含所有需要更新的字段,然后在服务方法中找到你的VoucherRepo和更新它们的字段,然后保存两个实体。当您有许多实体时,这将是一种混乱的方法。

如果您的 RepoVoucher 实体之间存在关系,例如 OneToMany,将会有另一种不同的方法。 p>


让我知道这是否回答了您的问题。有很多DTO对象和Services等并没有错。

如果您想轻松生成所有 DTO 对象,请查看:https://github.com/OpenAPITools/openapi-generator

【讨论】:

  • @CareyLynda 很高兴听到这个消息,如果这确实回答了您的问题,请将其标记为答案
猜你喜欢
  • 2020-01-07
  • 1970-01-01
  • 2018-06-17
  • 2020-07-08
  • 2020-03-18
  • 2023-02-19
  • 2018-10-02
  • 2020-08-01
  • 1970-01-01
相关资源
最近更新 更多