有人可以告诉我我做错了什么吗?我有下表:
实体:
@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的值(由第一个查询生成的全新值)无法识别。
有人可以告诉我我错过了什么吗? 提前谢谢!
答案 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);