这是我的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);
}
}
答案 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);