有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我试图使用@OneToOne作为双向映射来映射实体,但却遇到了奇怪的异常

在我停止服务器之前,这些都是我反复遇到的例外情况

at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.3.jar:2.11.3]

供应商和目录表字段


Catalog
-------
Sku Code(Unique)
Sku Name
Sku Description
Brand Name
Brand Description
Supplier Id(Foreign Key)

Supplier
--------
Supplier Id(Unique)
Supplier Name

下面是Catalog实体(Catalog.java)

package com.inventory.entities;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MapsId;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "catalog")
public class Catalog {

    @Id
    @Column(length = 50)
    // @GeneratedValue
    private int skuCode;
    @Column(length = 50)
    private String skuName;
    @Column(length = 50)
    private String skuDesc;
    @Column(length = 50)
    private String bName;
    @Column(length = 50)
    private String bDesc;
    @OneToOne
    @JoinColumn(name = "supplier_id")
    private Supplier supplier;// FK

    public Catalog() {
    }

    public Catalog(int skuCode, String skuName, String skuDesc, String bName, String bDesc, Supplier supplier) {
        super();
        this.skuCode = skuCode;
        this.skuName = skuName;
        this.skuDesc = skuDesc;
        this.bName = bName;
        this.bDesc = bDesc;
        this.supplier = supplier;
    }

    public int getSkuCode() {
        return skuCode;
    }

    public void setSkuCode(int skuCode) {
        this.skuCode = skuCode;
    }

    public String getSkuName() {
        return skuName;
    }

    public void setSkuName(String skuName) {
        this.skuName = skuName;
    }

    public String getSkuDesc() {
        return skuDesc;
    }

    public void setSkuDesc(String skuDesc) {
        this.skuDesc = skuDesc;
    }

    public String getbName() {
        return bName;
    }

    public void setbName(String bName) {
        this.bName = bName;
    }

    public String getbDesc() {
        return bDesc;
    }

    public void setbDesc(String bDesc) {
        this.bDesc = bDesc;
    }

    public Supplier getSupplier() {
        return supplier;
    }

    public void setSupplier(Supplier supplier) {
        this.supplier = supplier;
    }

    @Override
    public String toString() {
        return "Catalog [skuCode=" + skuCode + ", skuName=" + skuName + ", skuDesc=" + skuDesc + ", bName=" + bName
                + ", bDesc=" + bDesc + ", supplier=" + supplier + "]";
    }

}


这是供应商实体(Supplier.java)


package com.inventory.entities;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

@Entity
@Table(name = "supplier")
public class Supplier {

    @Id
    @Column(length = 50)
    private int supplierId;
    @Column(length = 50)
    private String supplierName;
    @OneToOne(mappedBy = "supplier",fetch = FetchType.LAZY)
    private Catalog catalog;

    public Supplier() {
    }

    public Supplier(int supplierId, String supplierName, Catalog catalog) {
        super();
        this.supplierId = supplierId;
        this.supplierName = supplierName;
        this.catalog = catalog;
    }

    public int getSupplierId() {
        return supplierId;
    }

    public void setSupplierId(int supplierId) {
        this.supplierId = supplierId;
    }

    public String getSupplierName() {
        return supplierName;
    }

    public void setSupplierName(String supplierName) {
        this.supplierName = supplierName;
    }

    public Catalog getCatalog() {
        return catalog;
    }

    public void setCatalog(Catalog catalog) {
        this.catalog = catalog;
    }

    @Override
    public String toString() {
        return "Supplier [supplierId=" + supplierId + ", supplierName=" + supplierName + ", catalog=" + catalog + "]";
    }

}


现在我的要求是,我想使用supplierId获取目录obj,它是目录实体中的外键,并且只使用@OneToOne,因为每个目录必须有一个唯一的供应商

package com.inventory.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.inventory.entities.Catalog;
import com.inventory.entities.Supplier;
import com.inventory.service.SupplierService;

@RestController
public class SupplierControllerImpl {

    @Autowired
    private SupplierService supplierService;
    
    @GetMapping("/supplier1/{supplier_id}")
    public Catalog getCatalog(@PathVariable int supplier_id) {
        Supplier supplier = supplierService.getSupplierById(supplier_id);
        return supplier.getCatalog();
    }

}

供应商服务。爪哇

package com.inventory.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.inventory.entities.Supplier;
import com.inventory.repository.SupplierRepository;

@Service
public class SupplierService {
    
    @Autowired
    private SupplierRepository supplierRepository;

    public Supplier getSupplierById(int id) {
        return supplierRepository.findById(id).get();
    }
    
    public Supplier insertSupplier(Supplier supplier) {
        return supplierRepository.save(supplier);
    }
    

}

请帮助我,因为我对Spring和Hibernate以及stackoverflow都是新手,如果有什么需要编辑或问题不清楚,请指导我,以便我可以进一步改进


共 (1) 个答案

  1. # 1 楼答案

    谢谢你现在查看这个问题,我终于得到了答案,因为我不知道问题的名称,这就是为什么我面临着很难找到答案的问题。我面临的问题是Infinite JSON Recursion Problem,解决方案是在目录中使用@JsonManagedReference覆盖supplierId,在供应商上使用@JsonBackReference覆盖catalog