spring - 一对多双向
问题描述
我的多对一关系有问题,因为我没有正确显示实体。
任何人都可以帮助我吗?
我附上了我的代码。
发票
@Entity
@Table(name = "invoices")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class Invoice {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String clave;
@OneToMany(mappedBy = "invoice", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY, orphanRemoval = true)
private List<InvoiceLine> lines;
发票行
@Entity
@Table(name = "invoice_lines")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class InvoiceLine {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "product", nullable = false)
private String product;
@ManyToOne
@JoinColumn(name = "invoice_id", referencedColumnName = "id", nullable = false)
private Invoice invoice;
控制器
@RestController
public class InvoiceController{
@Autowired
private InvoiceRepository invoiceRepository;
@Autowired
private InvoiceLineRepository invoiceLineRepository;
@GetMapping("/")
public Iterable<Invoice> findAllnvoices(){
return invoiceRepository.findAll();
}
@GetMapping("/invoiceLine")
public Iterable<InvoiceLine> findAllInvoiceLine(){
return invoiceLineRepository.findAll();
}
@GetMapping("/{id}")
public Optional<Invoice> findTagByInvoice(@PathVariable("id") Long id){
return invoiceRepository.findById(id);
}
}
我调用端点 invoiceLine 时的响应:
[
{
"id": 1,
"product": "Tag1-ES",
"invoice": {
"id": 1,
"clave": "Tag1",
"lines": [
1,
{
"id": 2,
"product": "Tag1-FR",
"invoice": 1
},
{
"id": 3,
"product": "Tag1-IT",
"invoice": 1
}
]
}
},
2,
3
]
我的问题:如果我都正确,为什么没有正确显示 ManyToOne 实体的响应?
解决方案
如果我在评论后正确理解了您的问题,那么您会被显示的“数字”所困扰。这些数字用于避免无限递归,它们指的是已经显示的实体。
所以数字“2”实际上是这样的:
{
"id": 2,
"product": "Tag1-FR",
"invoice": 1
}
如果不使用这样的表示,则整个发票及其项目将无限重复。
有几种不同的方法可以避免这种行为,例如使用@JsonIgnore 或@JsonBackReference 和@JsonManagedReference。看看这个关于他们差异的解释
@JsonIgnore 和 @JsonBackReference、@JsonManagedReference 之间的区别
推荐阅读
- json - 解析 avsc 文件以获取所需格式的键值对
- reactjs - 通过在 Reactjs 上运行数组来创建组件
- java - E/AndroidRuntime:致命异常:主 PID:19302 java.lang.RuntimeException:无法启动活动 ComponentInfo
- python - pyahk python setup.py egg_info 错误代码为 1 错误
- python - Scraper 仅将最后一个 URL 的数据输出到 CSV
- intellij-idea - 如何在 Intellij 中调试 Clojure Web 应用程序?
- git - 如何将每个文件从 repo 发送到实例?
- python - 当键是某个值时,如何仅在字典列表中的键值对中提取值
- batch-file - 批处理文件:将变量设置为函数调用的返回值
- c++ - 虚拟继承时的C ++构造函数顺序