代码之家  ›  专栏  ›  技术社区  ›  ECosta

我需要做什么才能自动填充子表的fk?我正在使用JPA

  •  0
  • ECosta  · 技术社区  · 3 年前

    我需要做什么才能自动填充子表的fk?我使用的是JPA、Spring Boot、MySql

    Postman中的JSON发送成功,但Request属性未填写,items_pedido表中的fk列(id_pedido)也未填写。

    enter image description here

    Pedido是父亲的阶级:

    package com.vendas.model;
    
    import java.util.Date;
    import java.util.List;
    
    import jakarta.persistence.CascadeType;
    import jakarta.persistence.Column;
    import jakarta.persistence.Entity;
    import jakarta.persistence.GeneratedValue;
    import jakarta.persistence.GenerationType;
    import jakarta.persistence.Id;
    import jakarta.persistence.OneToMany;
    import jakarta.persistence.Table;
    
    @Entity(name="pedidos")
    @Table(name="pedidos")
    public class Pedido{
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name="id_pedido", updatable = false, nullable = false)
        private Long idPedido;
        
        @Column(name="data_pedido")
        private Date dataPedido;
        
        @Column(name="status")
        private int status;
        
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido")
        private List<ItensPedido> itensPedido;
            
        public Pedido() {
            super();
        }
    
        public Long getIdPedido() {
            return idPedido;
        }
    
        public void setIdPedido(Long idPedido) {
            this.idPedido = idPedido;
        }
    
        public Date getDataPedido() {
            return dataPedido;
        }
    
        public void setDataPedido(Date dataPedido) {
            this.dataPedido = dataPedido;
        }
    
        public int getStatus() {
            return status;
        }
    
        public void setStatus(int status) {
            this.status = status;
        } 
    
        public List<ItensPedido> getItensPedido() {
            return itensPedido;
        }
    
        public void setItensPedido(List<ItensPedido> itensPedido) {
            this.itensPedido = itensPedido;
        }
        
        
        
        
    }
    
    

    Itens_pedido是儿童类:

    package com.vendas.model;
    
    import jakarta.persistence.Column;
    import jakarta.persistence.Entity;
    import jakarta.persistence.FetchType;
    import jakarta.persistence.GeneratedValue;
    import jakarta.persistence.GenerationType;
    import jakarta.persistence.Id;
    import jakarta.persistence.JoinColumn;
    import jakarta.persistence.ManyToOne;
    import jakarta.persistence.Table;
    
    @Entity(name="itens_pedido")
    @Table(name="itens_pedido")
    public class ItensPedido{
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name="id_item_pedido", updatable = false, nullable = false)
        private Long idItemPedido;
        @Column(name="id_produto")
        private Long idProduto;
        @Column(name="quantidade")
        private int quantidade;
        @Column(name="preco_venda")
        private double precoVenda;
        
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name="id_pedido")
        private Pedido pedido;
    
        
        public ItensPedido() {
            super();
        }
    
    
        public Long getIdItemPedido() {
            return idItemPedido;
        }
    
    
        public void setIdItemPedido(Long idItemPedido) {
            this.idItemPedido = idItemPedido;
        }
    
    
        public Long getIdProduto() {
            return idProduto;
        }
    
    
        public void setIdProduto(Long idProduto) {
            this.idProduto = idProduto;
        }
    
    
        public int getQuantidade() {
            return quantidade;
        }
    
    
        public void setQuantidade(int quantidade) {
            this.quantidade = quantidade;
        }
    
    
        public double getPrecoVenda() {
            return precoVenda;
        }
    
    
        public void setPrecoVenda(double precoVenda) {
            this.precoVenda = precoVenda;
        }
    
    
        public Pedido getPedido() {
            return pedido;
        }
    
    
        public void setPedido(Pedido pedido) {
            this.pedido = pedido;
        }
    
    
        
    }
    
    
    0 回复  |  直到 3 年前
        1
  •  0
  •   ECosta    3 年前

    您的指导工作得很好,但我知道这应该自动工作,而不需要服务中的此代码。

    @Service
    @Transactional
    public class PedidoService {
    
        @Autowired
        private PedidoRepository repository;
        
        public Pedido create(Pedido pedido) {
            Pedido result = repository.save(pedido);
    
            result.getItensPedido().forEach((it) -> it.setPedido(result));
            
            return repository.save(result);
            
        }
    

    它需要什么才能自动工作?

        2
  •  0
  •   Mar-Z    3 年前

    在您持久化Pedido实体的服务类中,您还应该设置关系。像这样的东西:

    for (ItensPedido ip : pedido.getItensPedido()) {
        ip.setPedido(pedido);
    }
    

    或者,您可以将此代码放在实体类方法中,并使用进行注释 @PrePersist @PreUpdate