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.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();
}
}
供应商服务.java
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 的新手,如果需要编辑或问题不清楚,请指导我,以便我进一步改进。
解决方案
感谢您现在查看这个问题终于我得到了答案,因为我不知道问题的名称,这就是为什么我面临这个难以找到答案的原因。我面临的问题是Infinite JSON Recursion Problem
,解决方案是@JsonManagedReference
在目录中使用供应商 ID 和@JsonBackReference
供应商而不是目录。
推荐阅读
- azure - Azure - 虚拟网络网关与 VPN 网关
- python - 替换文件中多个单词的更快方法
- python-3.x - 嵌套for循环时间效率低,寻找智能替代方案
- javascript - Jest + mongodb-memory-server 拆解时的问题
- javascript - 悬停时如何突出显示具有相同数据的两个不同表格上的单元格?
- file - React-Native - 本地文件的路径
- reactjs - 没有得到正确的 AsyncStorage.getItem() 返回
- ios - iOS 上的 mDns 错误 - 错误 49 无法分配请求的地址
- python - Python-除非输入正确的密码,否则如何防止程序打开
- r - 我们可以用 Plot_ly 绘制百分比吗