【问题标题】:@OneToMany object is only returning the ID when multiple parents have the same child object@OneToMany 对象仅在多个父对象具有相同子对象时返回 ID
【发布时间】:2022-01-20 04:13:44
【问题描述】:

我的两个实体之间存在多对一关系。我正在尝试获取一个 JSON 对象作为响应,其中包含多个父级具有相同子级时子实体的所有详细信息。我的问题是,如果 2 个父对象都有一个子对象,假设子对象有 ID=5,则第一个父对象在 JSON 中显示整个对象,但第二个父对象只显示 ID。

父实体(PendingTradeSkin.java)中的映射

@ManyToOne
@JoinColumn(name="skin_details_id")
private SkinDetails skinDetails;

子实体中的映射(SkinDetails.java)

@OneToMany(mappedBy="skinDetails", cascade= {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST})
@JsonIgnore
private List<PendingTradeSkin> pendingTradeSkins;

我目前收到的 JSON 响应

{
    "id": 3,
    "skinDetails": {
        "id": 5,
        "category": "category",
        "collection": "collection",
        "quality": "quality",
        "wear": "wear",
        "weapon": "weapon",
        "name": "name"
    },
    "price": 0.00,
    "dateBought": "2022-01-19",
    "quantity": 5
},
{
    "id": 6,
    "skinDetails": 5,
    "price": 0.00,
    "dateBought": "2022-01-19",
    "quantity": 5
}

我需要第二个对象 (id=6) 来输出整个 skinDetails 对象。

我的预感是我在使用 @ManyToOne/@OneToMany 映射时做错了什么,但似乎无法缩小导致此问题的原因。

非常感谢任何帮助,谢谢。

【问题讨论】:

  • 它不应该像这样工作,因为 skinDetails 是 SkinDetail 的一种。它应该是一个 skinDetail 对象,或者它应该为 null 它如何为您映射整数。更新您的完整模型和存储库
  • @GnanaJeyam 我能够找出我的模型的问题。我把它作为下面的答案包括在内。感谢您对我的问题提出意见!

标签: java spring-boot one-to-many many-to-one


【解决方案1】:

我将其发布为对此问题的答案,因为它解决了所描述的问题。

我的模型上有如下注释@JsonIdentityInfo:

@Entity
@Table(name="...")
@JsonIdentityInfo(
          generator = ObjectIdGenerators.PropertyGenerator.class, 
          property = "id")
public class SkinDetails {
    // class body
}

根据this,它指出“如果将注释@JsonIdentityInfo 添加到类中,那么任何ObjectMapper 都将通过用其id 替换除第一个之外的每个对象的出现来打破循环”这正是问题所在我遇到了我描述的问题。

从我的模型中删除此注释解决了我的问题,我现在得到了我期望的 JSON,而不仅仅是同一对象的第二个实例上的 ID。

【讨论】:

  • 非常感谢,我很困惑为什么会这样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2023-03-31
  • 2016-01-18
相关资源
最近更新 更多