一对多关系在我的带有 Postgres 数据库的 Spring Boot 应用程序中不起作用

问题描述 投票:0回答:1

我正在尝试在 Spring Boot 应用程序中使用 Postgres 数据库的连接。一些实体具有一对一关系,一些实体具有多个一对多关系。下面显示了实体类和运行器函数的代码以供参考。我没有显示 DevicesRequired 和 Benefit 的实体类。它们遵循与 DevicesReceived 相同的结构,在 @JoinColumn 中具有相同的“personal_details_id_no”字段,该字段也存在于我的数据库中的每个表中。我的问题是,当我执行“saveData”运行程序函数时,带有 @ManyToOne 注释的“owner”表中的“personal_details_id_no”始终为空。但是,PersonalDetail 表中的 @OneToOne 字段(即 address_id_no)已正确填写,不会出现任何问题。
我已尝试阅读文档,并且正确执行了步骤,但问题仍然存在。任何帮助将不胜感激。

注意:我使用 liquibase 来创建表。我已经在每个所有者表中创建了“personal_details_id_no”。

@Entity
@Table(name="personal_details")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class PersonalDetail extends Auditable<String> implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private String idNo;

    private String gender;

    private String name;

    // For Address
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id_no", referencedColumnName = "idNo")
    private Address address;

    // For Devices Received
    @JsonManagedReference
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "personalDetail", cascade = CascadeType.ALL)
    private List<DevicesReceived> devicesReceivedList;

    // For Devices Required
    @JsonManagedReference
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "personalDetail", cascade = CascadeType.ALL)
    private List<DevicesRequired> devicesRequiredList;

    // For Benefits
    @JsonManagedReference
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "personalDetail", cascade = CascadeType.ALL)
    private List<Benefit> benefitList;
}

@Entity
@Table(name = "address")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Address extends Auditable<String> implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    private String idNo;

    private String address;
}
@Entity
@Table(name="devices_received")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class DevicesReceived extends Auditable<String> implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;

    private String idNo;

    private String device;

    @JsonBackReference
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "personal_details_id_no", nullable = false)
    private PersonalDetail personalDetail;
}
// Runner Function
public void saveData(DetailsResponseDTO detailsResponseDTO) throws Exception {
    PersonalDetail personalDetail = new PersonalDetail().toBuilder()
            .idNo(detailsResponseDTO.getData().idNo())
            .name(detailsResponseDTO.getData().getName())
            .address(detailsResponseDTO.getData().getAddress())
            .devicesReceivedList(detailsResponseDTO.getData().getDevicesReceived())
            .devicesRequiredList(detailsResponseDTO.getData().getDevicesRequired())
            .benefitList(detailsResponseDTO.getData().getBenefits())
            .build();
    try {
        personalDetailRepository.save(personalDetail);
    } catch (Exception e) {
        System.out.println("Error while saving personalDetail Details: " + personalDetail + ", with Exception: " + e.toString());
        throw e;
    }
}
java postgresql spring-boot jpa one-to-many
1个回答
0
投票

我找到了答案。似乎必须在 PersonalDetail 类中显式定义 setter 函数,以建立父实体和子实体之间的关系。类似下面的函数,需要显式调用而不是使用构建器。

public void setDevicesReceivedList(List<DevicesReceived> devicesReceivedList) {
    for(DevicesReceived devicesReceived : devicesReceivedList) {
        devicesReceived.setPersonalDetail(this);
        this.devicesReceivedList.add(devicesReceived);
    }
}

这个 setter 必须在 runner 函数中显式调用,即

personalDetail.setDevicesReceivedList(detailsResponseDTO.getData().getDevicesReceived());
© www.soinside.com 2019 - 2024. All rights reserved.