Hibernate尝试为OneToOne实体关系外键插入null

时间:2017-04-18 13:36:38

标签: hibernate jpa spring-boot spring-data

这是我的oneToOne映射的SpringBoot Jpa实现。当我保存时,Hibernate尝试在company_id表中为company_details外键插入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);
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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

还在公司详细信息中设置公司:

    CompanyDetails cd = new CompanyDetails();
    cd.setName("cd");

    Company c = new Company();
    c.setDetails(cd);

    cd.setCompany(c);

    this.companyRepository.save(c);
相关问题