列表结构JPA

时间:2018-10-31 20:59:56

标签: java list spring-boot jpa

我正在使用带有JPA的spring boot的项目,并且在findAll方法(尤其是结构)方面遇到问题。

[
  {
    "idProducto": 5,
    "nombreProducto": "Perfil madera 2",
    "codProducto": 556,
    "proveedorProducto": {
      "idProveedor": 1,
      "rubro": "Maderas y tallados",
      "codProveedor": 2556
    },
    "tipoProducto": {
      "idTipoPro": 2,
      "descProducto": "Maderas"
    },
    "inventarioProducto": {
      "idInventario": 5,
      "stockInicial": 990,
      "stockCritico": 200,
      "fechaVencimiento": "2100-04-23",
      "precioVentaInv": 20000,
      "precioCompraInv": 10000,
      "fechaIngreso": "2018-04-23",
      "producto": 5
    }
  },
  {
    "idProducto": 6,
    "nombreProducto": "Perfil madera 4inch",
    "codProducto": 555,
    "proveedorProducto": 1,
    "tipoProducto": 2,
    "inventarioProducto": {
      "idInventario": 6,
      "stockInicial": 9997,
      "stockCritico": 200,
      "fechaVencimiento": "2100-04-23",
      "precioVentaInv": 25000,
      "precioCompraInv": 12000,
      "fechaIngreso": "2018-04-23",
      "producto": 6
    }
  }
]

如您所见,第一个产品具有正确的结构,但是第二个问题是“ tipoProducto”对象和“ productoProveedor”对象,我只获得其ID,而我不知道为什么得到这个结果。

这是我的课程结构:

public class Producto implements Serializable {
  @Id
  @NotNull
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "pro_id_producto")
  private int idProducto;
  @NotNull
  @Size(max = 45, message = "Máximo de 45")
  @Column(name = "pro_nombre_producto")
  private String nombreProducto;
  @NotNull
  @Column(name = "pro_codigo_producto")
  private int codProducto;
  @ManyToOne(fetch = FetchType.LAZY,optional = false)
  @JoinColumn(name = "pro_us_id_proveedor", referencedColumnName = "us_id_persona")
  private Proveedor proveedorProducto;

  @ManyToOne(fetch = FetchType.LAZY,optional = false)
  @JoinColumn(name = "pro_tp_id_tipo_producto", referencedColumnName = "pro_id_tipo_producto")
  private TipoProducto tipoProducto;

  @OneToOne(mappedBy = "producto",
      cascade = CascadeType.ALL,
      fetch = FetchType.LAZY, orphanRemoval = true)
  private Inventario inventarioProducto;
// getters and setters omited

这是我的仓库:

@Repository
public interface   ProductoRepository extends JpaRepository<Producto,Integer> {
  Producto getByCodProducto(int codPro);
  Boolean existsByCodProducto(int codPro);

}

这是我的服务层:

@Service
public class ProductoService {
  @Autowired
  private ProductoRepository productoRepository;

  public List<Producto> getAllProductos(){
   return productoRepository.findAll();
  }

  public Producto getProducto(int idPro)throws EntityNotFoundException{
    Producto producto = productoRepository.getOne(idPro);
    if (producto == null){
      throw  new EntityNotFoundException(Producto.class,"idProducto", Integer.toString(idPro));
    }
    return producto;
  }
  public void saveProducto(Producto producto){
    productoRepository.save(producto);
  }
  public Producto getProductoByCod(int codPro) throws  EntityNotFoundException{
    Producto producto = productoRepository.getByCodProducto(codPro);
    if (producto == null){
      throw new EntityNotFoundException(Producto.class,"codProducto", Integer.toString(codPro));
    }
    return producto;
  }
  public boolean deleteProducto(int id)throws EntityNotFoundException{
    Producto producto = productoRepository.getOne(id);
    if (producto == null){
      throw  new EntityNotFoundException(Producto.class,"idProducto",Integer.toString(id));
    }else {
      productoRepository.deleteById(id);
      return true;
    }
  }
  public boolean existeProducto(int cod){
    return productoRepository.existsByCodProducto(cod);
  }

如果映射有问题,我不会。任何帮助都会很棒。因为我一直在到处寻找答案。 附注:我是这个世界上的新手。

1 个答案:

答案 0 :(得分:0)

重现此行为的原因是,当您将获取类型放入Lazy Hibernate时,它不会持久存在。因此,您需要更改为Eager,它将加载与特定对象有关的所有关系。

    @ManyToOne(fetch = FetchType.EAGER, optional = false)