I have two tables: STUDY and Diagnosis, each study has a unique diagnosis, and the diagnosis' name is unique, my code is:
@Data
@Entity
@Table(name = "diagnosis")
public class Diagnosis {
@Id
@GeneratedValue(strategy =GenerationType.AUTO)
private Integer id;
@Column(unique = true)
private String name;
@Column
private String stage;
@Column
private String description;
}
the STUDY is :
@Data
@Entity
@Table(name = "study")
public class Study {
@Id
@Column
private Double uid;
@Column
private String manufacture;
@Column
private Date study_datatime;
@ManyToOne(cascade = {CascadeType.PERSIST})
@JoinColumn(name = "diagnosis_id")
private Diagnosis diagnosis;
}
but I got the exception:org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "CONSTRAINT_INDEX_E ON PUBLIC.DIAGNOSIS(NAME) VALUES ('Normal', 1)" I'm using H2 database 1.4.190, I don't know the reason.
Example test:
public static void main(String[] args) throws Exception{
Diagnosis diagnosis=new Diagnosis();
diagnosis.setName("normal");
Study study=new Study();
Study study1=new Study();
study.setDiagnosis(diagnosis);
study.setUid(1.0);
study1.setDiagnosis(diagnosis);
study1.setUid(2.0);
SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
session.persist(study);
session.persist(study1);
transaction.commit();
session.clear();
session.close();
}
actual code:
....
diagnosisName = row.getCell(6).getStringCellValue();
if (diagnosisNameMap.keySet().contains(diagnosisName) == false)
{
diagnosis.setName(diagnosisName);
diagnosisNameMap.put(diagnosisName,diagnosis);
study.setDiagnosis(diagnosis);
session.persist(diagnosis);
}else{
diagnosis=diagnosisNameMap.get(diagnosisName);
study.setUid(Double.parseDouble(row.getCell(0).toString()));
study.setDiagnosis(diagnosis);
}
session.persist(study);