首页 > 解决方案 > 一对多双向

问题描述

我的多对一关系有问题,因为我没有正确显示实体。

任何人都可以帮助我吗?

我附上了我的代码。

发票

@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 实体的响应?

标签: springhibernate

解决方案


如果我在评论后正确理解了您的问题,那么您会被显示的“数字”所困扰。这些数字用于避免无限递归,它们指的是已经显示的实体。

所以数字“2”实际上是这样的:

{
  "id": 2,
  "product": "Tag1-FR",
  "invoice": 1
}

如果不使用这样的表示,则整个发票及其项目将无限重复。

有几种不同的方法可以避免这种行为,例如使用@JsonIgnore 或@JsonBackReference 和@JsonManagedReference。看看这个关于他们差异的解释

@JsonIgnore 和 @JsonBackReference、@JsonManagedReference 之间的区别


推荐阅读