首页 > 解决方案 > Spring数据JPA一对多/多对一不在数据库中插入/更新细节

问题描述

我正在为一对多做一项小型的教学和地址关系活动,在地址块中,国家、地区、tahasil 等之间将存在一对一的关系。每当我点击 api 并保存它时,它不会在地址表中更新或插入地址. 细节是

@Entity
@Table(name = "teachers")
@PrimaryKeyJoinColumn(name = "user_id")
public class Teacher extends User {

@Size(min = 3, max = 50)
    @Column(name = "first_name")
    private String firstName;

    @Size(min = 3, max = 50)
    @Column(name = "middle_name")
    private String middleName;

    @Size(min = 3, max = 50)
    @Column(name = "last_name")
    private String lastName;

    @OneToMany(fetch = FetchType.LAZY,mappedBy = "teacher")
    @JsonManagedReference
    private Set<Address> addresses = new HashSet<>(0);

   Getter Setter...
}

然后地址实体

@Entity
@Table(name = "address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "address_id")
    private Long addressId;

    @ManyToOne (fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    @JsonBackReference
    private Teacher teacher;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "country_id", referencedColumnName = "country_id")
    private Country country;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "state_id", referencedColumnName = "state_id")
    private State state;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "district_id", referencedColumnName = "district_id")
    private District district;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "tahasil_id", referencedColumnName = "tahasil_id")
    private Tahasil tahasil;

    @Column(name = "line_one")
    private String lineOne;

    @Column(name = "line_two")
    private String lineTwo;

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

    @Column(name = "pincode")
    private Integer pincode;

    public Country getCountry() {
        return country;
    }
    Other Getter Setter

国家/地区示例与州、地区和 tahasil 相同

@Entity
@Table(name = "countries", uniqueConstraints = { @UniqueConstraint(columnNames = { "country_name" }) })
public class Country {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "country_id")
    private Long countryId;

    @NotBlank
    @Size(min = 3, max = 50)
    @Column(name = "country_name")
    private String countryName;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "country")
    private Address address;

    Getter Setter

最后在控制器中我正在做

    Optional<Teacher> teacher = teacherRepo.findByUserId(id);

        if (!teacher.isPresent())
            return ResponseEntity.notFound().build();

        teacher.get().setUserId(id);
        teacher.get().setFirstName(teacherUpdateForm.getFirstName());
        teacher.get().setMiddleName(teacherUpdateForm.getMiddleName());
        teacher.get().setLastName(teacherUpdateForm.getLastName()); 
        teacher.get().setAddresses(teacherUpdateForm.getAddresses());
        userRepository.save(teacher.get());

通过引用多个站点和读数来尝试这样做,但仍然无法看到对地址表的任何插入或更新。请帮助我理解我的错误。

问候, 切坦

标签: javaspring-boothibernatespring-data-jpa

解决方案


您需要级联教师实体的持久性。

更新 Teacher 实体中的 Address 属性定义:

@OneToMany(fetch = FetchType.LAZY,mappedBy = "teacher", cascade = CascadeType.ALL)
@JsonManagedReference
private Set<Address> addresses = new HashSet();

您可以根据需要使用级联类型值。


推荐阅读