当前位置: 首页 > 知识库问答 >
问题:

Spring数据Jpa中一对多映射的JSON结果出错

陶英达
2023-03-14

所有者实体: PriceListItemTest.java

@JsonPropertyOrder({"pricingUOMCode","lineTypeCode","primaryPricingUOMFlag","priceListId","itemId","priceListItemId"})
@Entity
@Table(name = "QP_PRICE_LIST_ITEMS")
public class PriceListItemTest implements Serializable{

    @Column(name = "price_list_item_id")    
    private String priceListItemId;

    @Column(name = "pricing_uom_code")  
    private String pricingUOMCode; 

    @Column(name = "line_type_code")    
    private String lineTypeCode; 

    @Column(name = "primary_pricing_uom_flag")  
    private String primaryPricingUOMFlag;

    @Id
    @Column(name = "item_id")   
    private String itemId;

    @OneToMany(mappedBy = "priceListItemsTest", cascade = CascadeType.ALL)
    private List<ItemDetailTest> itemDetailsTest;

    // getters and setters
}

和实体2: ItemDetailTest.java

@JsonPropertyOrder({"itemNumber","inventoryItemId","organizationId"})
@Entity
@Table(name = "egp_system_items_b")
public class ItemDetailTest implements Serializable {

    @Id
    @Column(name = "inventory_item_id") 
    private String inventoryItemId; 

    @Column(name = "item_number")   
    private String itemNumber; 

    @Column(name = "organization_id")   
    private String organizationId;


//   To be used for bidirectional   
    @ManyToOne//(fetch = FetchType.LAZY)
    private PriceListItemTest priceListItemsTest;

    // getters and setters
}

RestController在检索JSON结果时返回错误。

{
    "timestamp": "2018-10-23T14:05:26.248+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Could not write JSON: could not extract ResultSet; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not extract ResultSet (through reference chain: java.util.ArrayList[0]->com.Pricing.Pricing_App.model.PriceListItemTest[\"itemDetailsTest\"])",
    "path": "/getByItemIdTest"
}

可能是地图错了
如果它有oneToone映射,但面临OneToMany的问题,则工作正常。有人能帮我解决这个错误吗?

编辑:控制器:

@RestController
public class PriceListItemControllerTest {

    @Autowired
    private PriceListItemRepositoryTest priceListItemRepositoryTest;

    @GetMapping(value="/getByItemIdTest")
    public List<PriceListItemTest> getByItemIdTest(@RequestParam("itemId") String itemId) {
        return priceListItemRepositoryTest.findByItemId(itemId);
    }

}

共有3个答案

徐昆
2023-03-14

这两个实体之间有一个双向映射,这将在JSON序列化期间导致无限循环。

例如,您必须使用@JsonIgnore忽略其中一个边。

在这里阅读更多关于这个主题的信息:

https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion

华泳
2023-03-14

像下面一样使用@JsonIgnore。问题是无限的json调用正在通过json调用进行。要忽略这一点,请在多人关系中使用此注释。对我来说很好。

@ManyToOne//(fetch = FetchType.LAZY)
@JsonIgnore
private PriceListItemTest priceListItemsTest;
宋安晏
2023-03-14

更改模型类,如下所示:

@Entity
@Table(name = "QP_PRICE_LIST_ITEMS")
public class PriceListItemTest implements Serializable {

    private static final long serialVersionUID = -748956247024967638L;

    @Basic
    @Column(name = "price_list_item_id")    
    private String priceListItemId;

    @Basic
    @Column(name = "pricing_uom_code")  
    private String pricingUOMCode; 

    @Basic
    @Column(name = "line_type_code")    
    private String lineTypeCode; 

    @Basic
    @Column(name = "primary_pricing_uom_flag")  
    private String primaryPricingUOMFlag;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "item_id")   
    private String itemId;

    @JsonManagedReference
    @OneToMany(mappedBy = "priceListItemsTest", cascade = CascadeType.ALL)
    private List<ItemDetailTest> itemDetailsTest;

    // getters and setters
}

@Entity
@Table(name = "egp_system_items_b")
public class ItemDetailTest implements Serializable {

    private static final long serialVersionUID = 8495817802073010928L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "inventory_item_id") 
    private String inventoryItemId; 

    @Basic
    @Column(name = "item_number")   
    private String itemNumber; 

    @Basic
    @Column(name = "organization_id")   
    private String organizationId;

    @JsonBackReference
    @ManyToOne
    @JoinColumn(name = "fk_item_id", nullable = false) // name of the foreign key column
    private PriceListItemTest priceListItemsTest;

    // getters and setters
}

在JoinColumn中,提供外键字段的实际名称。它应该可以工作,因为杰克逊会自动序列化。

对于许多推荐,你可以点击以下链接:链接1和链接2

 类似资料:
  • 在spring数据JPA-Spring Boot应用程序中,我需要在两个表之间进行一对一映射。我在 一对一映射Spring数据示例 它运行良好,并在第二个表(图书详细信息)中插入记录。在我的应用程序中,我需要多次更新第二个表中的记录(如示例中所示,不更新pages列)。 我正在读取book对象,然后更新bookdetail字段,并使用存储库(extends Crudepository)将其保存回原

  • 主要内容:@ManyToOne 示例,程序输出结果多对一映射表示实体集合可以与相似实体关联的单值关联。 因此,在关系数据库中,实体的多于一行可以引用另一个实体的相似行。 完整的项目目录结构如下所示 - @ManyToOne 示例 在这个例子中,我们将创建一个学生和图书库之间的多对一关系,多个学生可以发布同一本书。 这个例子包含以下步骤 - 第1步: 在包中创建一个实体类,包含学生ID(s_id)和学生姓名(s_name),其中包含一个包含库类型对

  • 主要内容:@OneToMany 示例,程序输出结果一对多映射进入集合值关联的类别,其中实体与其他实体的集合关联。 因此,在这种类型的关联中,一个实体的实例可以映射到另一个实体的任意数量的实例。 完整的项目目录结构如下所示 - @OneToMany 示例 在这个例子中,我们将创建一个学生和图书库之间的一对多系,这样一个学生能发放多种类型的图书。 这个例子包含以下步骤 - 第1步: 在包下创建一个实体类,它包含学生ID(s_id),学生姓名(s_na

  • Mapstruct在Spring-Boot rest api中使用一对多和多对一关系映射我的实体时遇到了一个问题。 我有下面的课 因此,当我在评论中添加私有UserDTO用户时;进入PolicyDTO和公共列表PolicyList;进入UserDTO 结果策略列出了所有字段中的值都可以,当然,除了两个注释字段。如果我用双向关系将这两个字段取消注释到DTO中,结果不仅在关系字段中是null,而且在所

  • 我有一个Spring批处理应用程序,需要从4个表中进行选择。问题是,我无法使用关系,将编写Enricher来选择完整数据。 目前我有几个问题: 是否可以以简单的方式从JpaRepository映射非实体(POJO)。我看到了的示例。我正在寻找自动映射(也许是JPA,而不是Spring Data)。我可以用结果精确地制作列名,但它不起作用。 将POJO标记为实体没问题,但有问题。实体需要。这对我来说

  • 主要内容:@ManyToMany 示例,程序输出结果多对多映射表示集合值关联,其中任何数量的实体可以与其他实体的集合关联。 在关系数据库中,一个实体的任何行可以被引用到另一个实体的任意数量的行。 完整的项目目录结构如下所示 - @ManyToMany 示例 在这个例子中,我们将创建学生和图书馆之间的多对多关系,以便可以为任何数量的学生发放任何类型的书籍。 这个例子包含以下步骤 - 第1步: 在包中创建一个实体类,包含学生ID(s_id)和学生姓名(