我正在使用带有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);
}
如果映射有问题,我不会。任何帮助都会很棒。因为我一直在到处寻找答案。 附注:我是这个世界上的新手。
答案 0 :(得分:0)
重现此行为的原因是,当您将获取类型放入Lazy Hibernate时,它不会持久存在。因此,您需要更改为Eager,它将加载与特定对象有关的所有关系。
@ManyToOne(fetch = FetchType.EAGER, optional = false)