如何处理三个连接表的@JsonManagedReference和@JsonBackReference



我被困在给定的场景中:
有三个实体
a(账单(与供应商的多对一关系([双向]b( 供应商(与供应商和供应商银行的一对多关系(
c(供应商银行(与供应商的多对一关系([单向]

账单:显示有限字段

@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name="bill_details") 
public class Bills {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="bill_id")
private int bill_id;

@Column(name="bill_no")
private String billno;

@ManyToOne(cascade = {CascadeType.MERGE})
@JoinColumn(name="b_vendor_id")
private Vendors vendors;

/* Args contructor code here */

@JsonManagedReference
public Vendors getVendors() { return vendors; }

VendorBank:显示有限字段

public class VendorBank {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="v_bank_id")
private int vendorBankId;

@Column(name="v_acc_no")
private String accountNumber;

@Column(name="v_vendor_id")
private int vendor_id;

/*Both constructor code here*/
}

供应商类别:仅显示导入字段

/*Lombok code here*/    
public class Vendors {

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="vendor_id")
private int vendor_id;

@Column(name="vendor_name")
private String vendor_name;

@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name="v_vendor_id")
private List<VendorBank> vendorBank;

@OneToMany(mappedBy = "vendors",cascade = {CascadeType.DETACH,CascadeType.MERGE,
CascadeType.PERSIST,CascadeType.REFRESH})
private List<Bills> bills;

@JsonBackReference 
public List<Bills> getBills() {
return bills;
}
//@JsonManagedReference()
// @JsonIgnore
public List<VendorBank> getVendorBank() {
return vendorBank;
}

输出:

{
"bill_id": 102,
"billno": "B-858",
"vendors": {
"vendor_id": 3,
"vendor_name": "ABC Company",
"vendorBank": [
{
"vendorBankId": 14,
"accountNumber": "502998745002",
"vendor_id": 3
}
]
}
}

1.当我调用供应商端点时,我根据需要从供应商+供应商银行获得数据
2.但当我调用Bill端点时,我会从Bill+vendor+vendorbank获得数据,如上所述我不希望供应商银行来如果我在vendorbank上使用JsonIgnore,那么我得到了正确的输出,但以上第1点出错]

好的,所以您想要实现的是将实体中的一些数据包含在一个上下文中,而不将其包含在另一个上下文。

我认为您不能通过在实体上使用纯注释来实现这一点,因为它们没有调用上下文。

那么,我们在这里能做什么呢?

我们可以使用杰克逊Mixins。例如:

class YourClass {
public int ignoreThis() { return 0; }    
}

使用此Mixin

abstract class MixIn {
@JsonIgnore abstract int ignoreThis(); // we don't need it!  
}

有了这个:

objectMapper.getSerializationConfig().addMixInAnnotations(YourClass.class, MixIn.class)

然后,您可以使用它将对象序列化到控制器中的json中(在那里您可以将其发送到服务(,然后将其添加为响应主体并发送给用户。

如果您能够以某种方式配置ObjectMapper,这将是理想的,Spring在幕后使用它来实现这一点,然而,这是不可能的(至少很容易(,因为您需要将此objectMapper仅绑定到您的特定控制器,而不是所有控制器。

相关内容

  • 没有找到相关文章

最新更新