【问题标题】:SpringBoot JPA persist child of parent with nulls columnsSpring Boot JPA 使用 nulls 列保持父级的子级
【发布时间】:2020-02-19 00:55:05
【问题描述】:

我有一个奇怪的问题。我有实体公司、分公司和地址。 公司有分公司名单,每个分公司都有地址。 我试图坚持在地址实体之前不存在的分支,但地址是用空列坚持的。

@Data
@Entity
@Indexed
@Table(name = "company")
public class Company {

    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(
            name = "UUID",
            strategy = "org.hibernate.id.UUIDGenerator"
    )
    private String id;

    @Field
    @Column(name = "full_name", nullable = false, unique = true)
    private String fullName;

    @OneToMany(mappedBy = "company")
    private Set<Branch> branches;

}
@Data
@Entity
@Table(name = "branch")
public class Branch {

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

    @Column
    private String phone;

    @Column
    private String email;

    @OneToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "address_id", referencedColumnName = "id")
    private Address address;

    @ManyToOne
    @JoinColumn(name = "company_id", referencedColumnName = "id")
    private Company company;
}
@Entity
@Table(name = "address")
public class Address {

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

    @Column
    private String street;


    @OneToOne(mappedBy = "address")
    private Company company;

    @OneToOne(mappedBy = "address")
    private Branch branch;
}

服务...

    public Integer addBranch(BranchDto branchDto) {
        Branch branch = modelMapper.map(branchDto, Branch.class);

        Company company = companyRepository.getCompanyById(branchDto.getCompanyId());
        branch.setCompany(company);

        return branchRepository.save(branch).getId();
    }

Dto...

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class BranchDto {

    private Integer id;

    private String phone;

    private String email;

    private AddressDto address;

    private String companyId;
}

这就是效果……

调试器...

有什么问题?你能帮帮我吗?

【问题讨论】:

  • 查看调试器中的对象标识符Branch@...Address@....。地址应与 branch.address 相同的对象,并且 address.branch.address 应与 Address 相同的对象。您的映射代码可能在某处搞砸了
  • 我发现 jpa 存在不存在地址的持久不存在分支的问题。所以我不得不坚持 Branch 并在设置地址之后再次坚持 Branch。

标签: java database spring jpa cascade


【解决方案1】:

您正在使用具有相同 id 的“mappedBy”,它仅适用于他找到的第一个。

尝试换成其他id。

【讨论】:

  • 但为什么它适用于用户和公司但不适用于分支?
  • 没问题,JPA很聪明,懂的。
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 2017-08-31
  • 2018-03-03
  • 2021-01-18
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多