Java 同时在两个类上进行Spring引导更新

Java 同时在两个类上进行Spring引导更新,java,spring,spring-boot,rest,dto,Java,Spring,Spring Boot,Rest,Dto,我用SpringBoot启动一个项目,我使用一个有6个表的数据库。 这是一个CRUD应用程序 因此,我有5个表的entities/dto/service/controller/repository包。(SQL中的6个表) 现在,我想将实体x的表x(SQL)列中的一行更新为特定行中的另一个实体y 在我看来,这应该在createx的服务层完成,但是如何完成呢 我是否应该使用来自2个实体的数据创建xyDTO?我害怕这样做,因为表y不会自动更新。但是当创建xyDTO时。我不要这个 如何将特定DTO x的

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

因此,我有5个表的entities/dto/service/controller/repository包。(SQL中的6个表)

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

在我看来,这应该在createx的服务层完成,但是如何完成呢

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

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

我在网上找不到类似的例子。有人能帮我吗

我的代码:

@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;
    }
}
@实体
@表(name=“回购”)
公开回购{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
长id;
@列(name=“stock”)
私人长期股;
}
@实体
@表(name=“凭证”)
公课券{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私人长id;
@列(名称=“数量”)
私有大十进制数;
@列(name=“type”)
私有布尔型;
}
@服务
公共类凭单服务{
@凌驾
公共凭证dto实体(凭证dto){
凭证=新凭证();
凭证.setId(dto.getId());
凭证.setDescription(dto.getDescription());
List voucherList=new ArrayList();
对于(VoucherProductDTOMini inv:dto.getVoucherproducts()){
VoucherProduct voucherL=voucherProductService.DTOtoEntity(inv);
voucherList.add(voucherL);
}
凭证.设置凭证产品(凭证列表);
退货凭证;
}
@凌驾
创建凭证的公共凭证(凭证到凭证){
凭证=新凭证();
凭证=凭证存储库。保存(凭证);
VoucherDTO voucherDTOnew=新的VoucherDTO(凭证);
退还凭证;
}
}
我应该 检查我的凭证类型(true),我应该在 股票

我可以用哪种方式同时更新这两个实体


当我添加真实凭证时,我应该在我的
回购股票
上添加
凭证.数量的数据

首先,我想强调您代码中的一些内容:

  • 我找不到在您的服务中对这些方法使用
    @Override
    注释的原因
  • createVoucher
    方法中,创建完全为空的实体,这不是一件好事
  • DTO代表数据传输对象,通常在Spring应用程序中,它用于向服务传输数据或从服务传输数据。例如:控制器。例如,当用户发出Http请求以接收所有凭证时,您希望返回VoucherDto,其中只包含您希望用户看到的字段

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


    回答您关于如何在一次呼叫中更新两个实体的问题。正如我理解您的问题,您希望通过一个请求更新两个不同实体中的不同属性。这是可能的,尽管有不同的方法

  • 创建两个不同的DTOs,每个实体一个。创建两个不同的Http请求,每个请求将使用一个DTO并调用服务中的一个方法来更新每个实体。例如:VoucherController.updateVoucher->VoucherService.updateVoucherRepoController.updateRepo->RepoService.updateRepo。我个人更喜欢将此作为解决方案,因为您的实体凭证和回购没有任何关系
  • 创建一个DTO对象,其中包含需要更新的所有字段,然后在服务方法中找到您的凭证回购,并更新其字段,然后保存这两个实体。当您有许多实体时,这将是一种混乱的方法
  • 如果您的回购和凭证实体(例如OneToMany)之间存在关系,则会有另一种不同的方法


    让我知道这是否回答了你的问题。拥有许多DTO对象和服务等并没有什么错


    如果您想轻松生成所有DTO对象,请查看以下内容:

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