Spring Boot 如何使用Flyway在Sping Boot JPA中实现一对多关系

4nkexdtk  于 2023-06-05  发布在  Spring
关注(0)|答案(1)|浏览(191)

我想为以下实体建立一对多关系。(membership_plan可以有多个membership_plan_features)。我用的是Sping Boot 3.0.6。

@Entity
@Table(name = "membership_plan")
public class MembershipPlan {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long planId;

    @Column(name = "org_id")
    private String orgId;

    @Column(name = "plan_name")
    private String planName;

    @Column(name = "plan_price")
    private String planPrice;

    @OneToMany (mappedBy = "membershipPlan")
    private List<MembershipPlanFeature> planFeature;
}

第二实体

@Entity
@Table(name = "membership_plan_feature")
@Getter
@Setter
public class MembershipPlanFeature {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "org_id")
    private String orgId;

    @Column(name = "feature_name")
    private String featureName;

    @Column(name = "feature_desc")
    private String featureDesc;

    @ManyToOne
    @JoinColumn(name="plan_id")
    private MembershipPlan membershipPlan;
}

以下是飞行路线查询:

CREATE TABLE membership_plan (
   plan_id INT NOT NULL,
   org_id VARCHAR(255) NULL,
   plan_name VARCHAR(255) NULL,
   plan_price VARCHAR(255) NULL,
   PRIMARY KEY (plan_id)
   );

CREATE TABLE membership_plan_feature (
   id INT AUTO_INCREMENT NOT NULL,
   org_id VARCHAR(255) NULL,
   plan_id INT NOT NULL,
   feature_name VARCHAR(255) NULL,
   feature_desc VARCHAR(255) NULL,
   PRIMARY KEY (id)
);

ALTER table membership_plan_feature
ADD CONSTRAINT fk_membership_plan_feature
FOREIGN KEY (plan_id)
REFERENCES membership_plan (plan_id);

现在,当我查询membershipPlanRepository.findAll();时,它返回一个递归数据:

[
    {
        "planId": 1,
        "orgId": "101",
        "planName": "GOLD",
        "planPrice": "29",
        "planFeature": [
            {
                "id": 1,
                "orgId": "101",
                "featureName": "Kanban",
                "featureDesc": "Kanban",
                "membershipPlan": {
                    "planId": 1,
                    "orgId": "101",
                    "planName": "GOLD",
                    "planPrice": "29",
                    "planFeature": [
                        {
                            "id": 1,
                            "orgId": "101",
                            "featureName": "Kanban",
                            "featureDesc": "Kanban",
                            "membershipPlan": {
                                "planId": 1,
                                "orgId": "101",
                                "planName": "GOLD",
                                "planPrice": "29",
                                "planFeature": [... and so on

以下是例外:

Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)]

请让我知道我哪里做错了。

djp7away

djp7away1#

您必须告诉Jackson跳过为实体生成嵌套字段:

...
    @ManyToOne
    @JoinColumn(name = "plan_id")
    @JsonBackReference // Add this
    private MembershipPlan membershipPlan;
    ...
...
    @OneToMany(mappedBy = "membershipPlan")
    @JsonManagedReference // Add this
    private List<MembershipPlanFeature> planFeature;
    ...

相关问题