org.hibernate.exception.ConstraintViolationException:Column' pacientId'不能为空

时间:2016-09-26 21:47:04

标签: java hibernate

有人可以告诉我我做错了什么吗?我有下表:

enter image description here

实体:

@Entity
@NamedQuery(name = "Pacients.findAll", query = "SELECT p FROM Pacients p")
public class Pacients implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int pacientId;

    private String name;

    private String surname;

    // bi-directional many-to-one association to DetaliiPacient
    @OneToOne(mappedBy = "pacient")
    @Cascade(value = { CascadeType.ALL})
    private PacientsDetails pacientDetail;

}

@Entity
@Table
@NamedQuery(name = "PacientsDetails.findAll", query = "SELECT d FROM PacientsDetails d")
public class PacientsDetails implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int pacientDetailsId;

    private String address;

    @OneToOne
    @JoinColumn(name = "pacientId",referencedColumnName="pacientId")
    @Cascade(value = { CascadeType.ALL})
    @JsonBackReference
    private Pacients pacient;
}

该领域" pacientId"来自" pacients" table是AUTO_INCREMENT,我正在使用mysql数据库。

我正在执行以下操作时出现标题错误:

sessionFactory.getCurrentSession().persist(pacient);

在日志中我看到Hibernate在做:

Hibernate: insert into Pacients (doctorId, name, surname) values (?, ?, ?)
Hibernate: insert into PacientsDetails (address, pacientId) values (?, ?)

但问题在于,在第二个查询中,pacientId的值(由第一个查询生成的全新值)无法识别。

有人可以告诉我我错过了什么吗? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

我假设你正在创建这样的实体(我知道这些字段是私有的,但我们假装它们不是)

pacient = new Pacients();
// set name & surname
pacient.pacientDetail = new PacientsDetails();
// set address

如果是这种情况,您还需要在pacientsDetails中设置pacients字段,因为PacientsDetails根据您的mappedBy映射关系

@OneToOne(mappedBy = "pacient")

所以看起来应该是这样的

pacient = new Pacients();
// set name & surname
pacient.pacientDetail = new PacientsDetails();
// set address
pacient.pacientDetail.pacient = pacient;

答案 1 :(得分:0)

在persist()

之后执行flush()
sessionFactory.getCurrentSession().persist(patient);
sessionFactory.getCurrentSession().flush();
...
patientDetails.setPatientId(patient.getId());
...
sessionFactory.getCurrentSession().persist(patientDetails);