【问题标题】:Hibernate attempts to insert null for the OneToOne entity relationship foreign keyHibernate 尝试为 OneToOne 实体关系外键插入 null
【发布时间】:2017-09-14 09:20:24
【问题描述】:

这是我用于 oneToOne 映射的 SpringBoot Jpa 实现。当我保存时,Hibernate 尝试在company_details 表中为company_id 外键插入null,如下面的CompanyService.createCompany() 代码所示。 感谢任何帮助。

CREATE TABLE companies (
  id                  BIGSERIAL PRIMARY KEY    NOT NULL,
  access_token        VARCHAR(255)             NOT NULL,
  access_secret       VARCHAR(255)             NOT NULL,
  token_expires_at    TIMESTAMP WITH TIME ZONE NOT NULL
);

CREATE TABLE company_details (
  id                   BIGSERIAL PRIMARY KEY    NOT NULL,
  company_id           BIGSERIAL                NOT NULL REFERENCES companies (id),
  company_name         VARCHAR(50)              NOT NULL
);

@Entity
@Table(name = "companies")
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(updatable = false)
    private Long id;

    @OneToOne(
        fetch = FetchType.EAGER,
        mappedBy = "company",
        cascade = CascadeType.ALL
    )
    private CompanyDetails details;
    ...
}

@Entity
@Table(name = "company_details")
public class CompanyDetails {

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

    @OneToOne
    @JoinColumn(name = "company_id")
    @MapsId
    @JsonBackReference // avoid cyclic references
    private Company company;

    @Size(max = 50)
    @NotNull
    private String companyName;
}

@Service
public class CompanyService {
    @Autowired
    private CompanyRepository companyRepository;

    @Transactional
    public Company createCompany() {
        CompanyDetails cd = new CompanyDetails();
        cd.setName("cd");

        Company c = new Company();
        c.setDetails(cd);
        this.companyRepository.save(c);
    }
}

【问题讨论】:

    标签: hibernate jpa spring-boot spring-data


    【解决方案1】:

    您的实体似乎没有共享主键。

    因此删除@MapsId 并保持如下:

    @OneToOne
    @JoinColumn(name = "company_id")
    @JsonBackReference // avoid cyclic references
    private Company company;
    

    同时在 companyDetails 中设置公司:

        CompanyDetails cd = new CompanyDetails();
        cd.setName("cd");
    
        Company c = new Company();
        c.setDetails(cd);
    
        cd.setCompany(c);
    
        this.companyRepository.save(c);
    

    【讨论】:

    • 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多