我在我的项目中使用 Hibenate+ JPA + Spring boot ,我遇到的问题是 - 当我尝试保存代码中描述的实体时,整个实体以及子实体都被正确保存,但是当我尝试更新它抛出主键违规异常的实体,我做错了什么吗? 我使用 postgressql 作为数据库
ProposeSubjects.Java
@Entity
@Table(name = "proposed_subjects", schema = "acadcore",
uniqueConstraints
= @UniqueConstraint(columnNames = {"proposal_code", "subject_prop_id"}))
@IdClass(ProposedSubjectsPK.class)
@XmlRootElement
public class ProposedSubjects extends InstituteAwareSmileEntity {
int confirm_seq;
@Id
Integer subject_prop_id;
public int getConfirm_seq() {
return confirm_seq;
}
public void setConfirm_seq(int confirm_seq) {
this.confirm_seq = confirm_seq;
}
public Integer getSubject_prop_id() {
return subject_prop_id;
}
public void setSubject_prop_id(Integer subject_prop_id) {
this.subject_prop_id = subject_prop_id;
}
@NotEmpty(message = "{error.notEmpty}")
@Pattern(regexp = "[a-zA-Z0-9]*", message = "This field must be character only")
@Size(max = 200, message = "Should not exceed 200 characters")
@Column(name = "proposal_code", unique = true)
private String proposalcode;
public String getProposalcode() {
return proposalcode;
}
public void setProposalcode(String proposalcode) {
this.proposalcode = proposalcode;
}
@NotEmpty(message = "{error.notEmpty}")
@Pattern(regexp = "[a-zA-Z]*", message = "This field must be character only")
@Size(max = 50, message = "Should not exceed 50 characters")
@Column(name = "deptcode")
private String deptcode;
@NotEmpty(message = "{error.notEmpty}")
@Size(max = 5000, message = "Should not exceed 5000 characters")
@Column(name = "objectives")
private String objectives;
@Column(name = "start_session")
private BigInteger startSession;
@Pattern(regexp = "[a-zA-Z0-9]*", message = "This field must be character only")
@Size(max = 50, message = "Should not exceed 50 characters")
@Column(name = "schedule_code")
private String scheduleCode;
@Column(name = "overlaped_subject")
@Pattern(regexp = "[a-zA-Z0-9]*", message = "This field must be character only")
@Size(max = 5000, message = "Should not exceed 5000 characters")
private String overlapedSubject;
@Column(name = "percent_overlap")
@DecimalMax(value = "100.00", message = "Can't Be More Than 100")
@DecimalMin(value = "0.00", message = "Can't Be Less Than 0")
private BigInteger percentOverlap;
@Size(max = 5000, message = "Should not exceed 5000 characters")
@Column(name = "reason_for_new_sub")
private String reasonForNewSub;
@NotEmpty(message = "{error.notEmpty}")
@Size(max = 100, message = "Should not exceed 100 characters")
@Column(name = "evaluation_committee")
private String evaluationCommittee;
@Column(name = "new_course_flag")
private Character newCourseFlag;
@Size(max = 50, message = "Can't be more than 50 ")
@Column(name = "doc_id")
private String docId;
@Size(max = 300)
@Column(name = "correction_note")
private String correctionNote;
@Size(max = 50)
@Column(name = "entry_by")
private String entryBy;
@NotEmpty(message = "{error.notEmpty}")
@Pattern(regexp = "[a-zA-Z0-9\\s]*", message = "This field must be character only")
@Size(max = 200, message = "Should not exceed 200 characters")
@Column(name = "subject_name")
private String subjectName;
@NotEmpty(message = "{error.notEmpty}")
@Size(max = 10000, message = "Should not exceed 10000 characters")
@Column(name = "subject_contents")
private String subjectContents;
@Column(name = "l")
@DecimalMax(value = "10.00", message = "Can't Be More Than 10")
@DecimalMin(value = "0.00", message = "Can't Be Less Than 0")
private BigInteger l;
@Column(name = "t")
@DecimalMax(value = "10.00", message = "Can't Be More Than 10")
@DecimalMin(value = "0.00", message = "Can't Be Less Than 0")
private BigInteger t;
@Column(name = "p")
@DecimalMax(value = "10.00", message = "Can't Be More Than 10")
@DecimalMin(value = "0.00", message = "Can't Be Less Than 0")
private BigInteger p;
@Column(name = "credit")
@DecimalMax(value = "100.00", message = "Can't Be More Than 10")
@DecimalMin(value = "0.00", message = "Can't Be Less Than 0")
private BigInteger credit;
@Column(name = "entry_on")
@Temporal(TemporalType.TIMESTAMP)
private Date entryOn;
@NotNull(message = "{error.notEmpty}")
@Column(name = "schedule_type")
private Character scheduleType;
@Column(name = "contract_hour")
private BigInteger contractHour;
@Size(max = 50)
@Column(name = "status")
private String status;
@Size(max = 50)
@Column(name = "modified_by")
private String modifiedBy;
@Column(name = "modification_time")
@Temporal(TemporalType.TIMESTAMP)
private Date modificationTime;
@Size(max = 50)
@Column(name = "created_by")
private String createdBy;
@Column(name = "creation_time")
@Temporal(TemporalType.TIMESTAMP)
private Date creationTime;
@Size(max = 100)
@Column(name = "workflowid")
private String workflowid;
@Column(name = "instanceid")
private Integer instanceid;
@Size(max = 500)
@Column(name = "prerequisite")
private String prerequisite;
@Size(max = 50)
@Column(name = "subno")
private String subno;
@Size(max = 5000, message = "Should not exceed 5000 characters")
@Column(name = "reference_books")
private String referenceBooks;
@Size(max = 5000, message = "Should not exceed 5000 characters")
@Column(name = "text_books")
private String textBooks;
@Column(name = "confirm_flag")
private Character confirmFlag;
@Size(max = 500, message = "Should not exceed 5000 characters")
@Column(name = "concurrent_subjects")
private String concurrentSubjects;
@Column(name = "level_code")
private Integer levelCode;
@Size(max = 100)
@Column(name = "teacher_ec")
private String teacherEc;
@NotNull(message = "{error.notEmpty}")
@Column(name = "subject_type")
private String subjectType;
@OneToMany(fetch = FetchType.LAZY,
cascade = CascadeType.ALL, mappedBy = "proposedSubjects")
private List<ProposedCourseCompType> proposedCourseCompTypeCollection;
public ProposedSubjects() {
}
public String getDeptcode() {
return deptcode;
}
public void setDeptcode(String deptcode) {
this.deptcode = deptcode;
}
public String getObjectives() {
return objectives;
}
public void setObjectives(String objectives) {
this.objectives = objectives;
}
public BigInteger getStartSession() {
return startSession;
}
public void setStartSession(BigInteger startSession) {
this.startSession = startSession;
}
public String getScheduleCode() {
return scheduleCode;
}
public void setScheduleCode(String scheduleCode) {
this.scheduleCode = scheduleCode;
}
public String getOverlapedSubject() {
return overlapedSubject;
}
public void setOverlapedSubject(String overlapedSubject) {
this.overlapedSubject = overlapedSubject;
}
public BigInteger getPercentOverlap() {
return percentOverlap;
}
public void setPercentOverlap(BigInteger percentOverlap) {
this.percentOverlap = percentOverlap;
}
public String getReasonForNewSub() {
return reasonForNewSub;
}
public void setReasonForNewSub(String reasonForNewSub) {
this.reasonForNewSub = reasonForNewSub;
}
public String getEvaluationCommittee() {
return evaluationCommittee;
}
public void setEvaluationCommittee(String evaluationCommittee) {
this.evaluationCommittee = evaluationCommittee;
}
public Character getNewCourseFlag() {
return newCourseFlag;
}
public void setNewCourseFlag(Character newCourseFlag) {
this.newCourseFlag = newCourseFlag;
}
public String getDocId() {
return docId;
}
public void setDocId(String docId) {
this.docId = docId;
}
public String getCorrectionNote() {
return correctionNote;
}
public void setCorrectionNote(String correctionNote) {
this.correctionNote = correctionNote;
}
public String getEntryBy() {
return entryBy;
}
public void setEntryBy(String entryBy) {
this.entryBy = entryBy;
}
public String getSubjectName() {
return subjectName;
}
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
public String getSubjectContents() {
return subjectContents;
}
public void setSubjectContents(String subjectContents) {
this.subjectContents = subjectContents;
}
public BigInteger getL() {
return l;
}
public void setL(BigInteger l) {
this.l = l;
}
public BigInteger getT() {
return t;
}
public void setT(BigInteger t) {
this.t = t;
}
public BigInteger getP() {
return p;
}
public void setP(BigInteger p) {
this.p = p;
}
public BigInteger getCredit() {
return credit;
}
public void setCredit(BigInteger credit) {
this.credit = credit;
}
public Date getEntryOn() {
return entryOn;
}
public void setEntryOn(Date entryOn) {
this.entryOn = entryOn;
}
public Character getScheduleType() {
return scheduleType;
}
public void setScheduleType(Character scheduleType) {
this.scheduleType = scheduleType;
}
public BigInteger getContractHour() {
return contractHour;
}
public void setContractHour(BigInteger contractHour) {
this.contractHour = contractHour;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getModifiedBy() {
return modifiedBy;
}
public void setModifiedBy(String modifiedBy) {
this.modifiedBy = modifiedBy;
}
public Date getModificationTime() {
return modificationTime;
}
public void setModificationTime(Date modificationTime) {
this.modificationTime = modificationTime;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public Date getCreationTime() {
return creationTime;
}
public void setCreationTime(Date creationTime) {
this.creationTime = creationTime;
}
public String getWorkflowid() {
return workflowid;
}
public void setWorkflowid(String workflowid) {
this.workflowid = workflowid;
}
public Integer getInstanceid() {
return instanceid;
}
public void setInstanceid(Integer instanceid) {
this.instanceid = instanceid;
}
public String getPrerequisite() {
return prerequisite;
}
public void setPrerequisite(String prerequisite) {
this.prerequisite = prerequisite;
}
public String getSubno() {
return subno;
}
public void setSubno(String subno) {
this.subno = subno;
}
public String getReferenceBooks() {
return referenceBooks;
}
public void setReferenceBooks(String referenceBooks) {
this.referenceBooks = referenceBooks;
}
public String getTextBooks() {
return textBooks;
}
public void setTextBooks(String textBooks) {
this.textBooks = textBooks;
}
public Character getConfirmFlag() {
return confirmFlag;
}
public void setConfirmFlag(Character confirmFlag) {
this.confirmFlag = confirmFlag;
}
public String getConcurrentSubjects() {
return concurrentSubjects;
}
public void setConcurrentSubjects(String concurrentSubjects) {
this.concurrentSubjects = concurrentSubjects;
}
public Integer getLevelCode() {
return levelCode;
}
public void setLevelCode(Integer levelCode) {
this.levelCode = levelCode;
}
public String getTeacherEc() {
return teacherEc;
}
public void setTeacherEc(String teacherEc) {
this.teacherEc = teacherEc;
}
public String getSubjectType() {
return subjectType;
}
public void setSubjectType(String subjectType) {
this.subjectType = subjectType;
}
public void addComponent(ProposedCourseCompType Component) {
Component.setProposedSubjects(this);
this.proposedCourseCompTypeCollection.add(Component);
}
@Override
public String toString() {
return "ProposedSubjects{" + "confirm_seq=" + confirm_seq + ", subject_prop_id=" + subject_prop_id + ", proposalcode=" + proposalcode + ", deptcode=" + deptcode + ", objectives=" + objectives + ", startSession=" + startSession + ", scheduleCode=" + scheduleCode + ", overlapedSubject=" + overlapedSubject + ", percentOverlap=" + percentOverlap + ", reasonForNewSub=" + reasonForNewSub + ", evaluationCommittee=" + evaluationCommittee + ", newCourseFlag=" + newCourseFlag + ", docId=" + docId + ", correctionNote=" + correctionNote + ", entryBy=" + entryBy + ", subjectName=" + subjectName + ", subjectContents=" + subjectContents + ", l=" + l + ", t=" + t + ", p=" + p + ", credit=" + credit + ", entryOn=" + entryOn + ", scheduleType=" + scheduleType + ", contractHour=" + contractHour + ", status=" + status + ", modifiedBy=" + modifiedBy + ", modificationTime=" + modificationTime + ", createdBy=" + createdBy + ", creationTime=" + creationTime + ", workflowid=" + workflowid + ", instanceid=" + instanceid + ", prerequisite=" + prerequisite + ", subno=" + subno + ", referenceBooks=" + referenceBooks + ", textBooks=" + textBooks + ", confirmFlag=" + confirmFlag + ", concurrentSubjects=" + concurrentSubjects + ", levelCode=" + levelCode + ", teacherEc=" + teacherEc + ", subjectType=" + subjectType + ", proposedCourseCompTypeCollection=" + proposedCourseCompTypeCollection + '}';
}
@XmlTransient
public List<ProposedCourseCompType> getProposedCourseCompTypeCollection() {
return proposedCourseCompTypeCollection;
}
public void setProposedCourseCompTypeCollection(List<ProposedCourseCompType> proposedCourseCompTypeCollection) {
this.proposedCourseCompTypeCollection = proposedCourseCompTypeCollection;
}
}
提议的CourseCompType.Java
@Entity
@Table(name = "proposed_course_comp_type", catalog = "smiledb1", schema = "acadcore")
@IdClass(ProposedCourseCompTypePK.class)
@NamedQueries({
@NamedQuery(name = "ProposedCourseCompType.findAll", query = "SELECT p FROM ProposedCourseCompType p")})
public class ProposedCourseCompType extends InstituteAwareSmileEntity {
@Id
@Basic(optional = false)
@NotNull
@Column(name = "proposed_course_comp_type_id")
private int proposedCourseCompTypeId;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "subject_prop_id")
private int subjectPropId;
@Size(max = 50)
@Column(name = "course_id")
private String courseId;
@Column(name = "schedule_id")
private Integer scheduleId;
@Size(max = 50)
@Column(name = "type_id")
private String typeId;
@Size(max = 50)
@Column(name = "created_by")
private String createdBy;
@Column(name = "creation_time")
@Temporal(TemporalType.TIMESTAMP)
private Date creationTime;
@Size(max = 50)
@Column(name = "modified_by")
private String modifiedBy;
@Column(name = "modification_time")
@Temporal(TemporalType.TIMESTAMP)
private Date modificationTime;
@Basic(optional = false)
@NotNull
@Column(name = "prop_confirm_sequence")
private int propConfirmSequence;
@Size(max = 50)
@Column(name = "addon_type")
private String addonType;
@Size(max = 100)
@Column(name = "new_course_proposal_id")
private String newCourseProposalId;
@JoinColumns({
@JoinColumn(name = "subject_prop_id", referencedColumnName = "subject_prop_id", insertable = false, updatable = false)
, @JoinColumn(name = "institute_id", referencedColumnName = "institute_id", insertable = false, updatable = false)})
@ManyToOne(optional = false,fetch = FetchType.LAZY)
private ProposedSubjects proposedSubjects;
// public ProposedCourseCompType() {
// }
// public ProposedCourseCompType() {
// throw new UnsupportedOperationException("Not supported yet 54."); //To change body of generated methods, choose Tools | Templates.
// }
public String getCourseId() {
return courseId;
}
@Override
public String toString() {
return "ProposedCourseCompType{" + "proposedCourseCompTypeId=" + proposedCourseCompTypeId + ", subjectPropId=" + subjectPropId + ", courseId=" + courseId + ", scheduleId=" + scheduleId + ", typeId=" + typeId + ", createdBy=" + createdBy + ", creationTime=" + creationTime + ", modifiedBy=" + modifiedBy + ", modificationTime=" + modificationTime + ", propConfirmSequence=" + propConfirmSequence + ", addonType=" + addonType + ", newCourseProposalId=" + newCourseProposalId + '}';
}
public void setCourseId(String courseId) {
this.courseId = courseId;
}
public Integer getScheduleId() {
return scheduleId;
}
public void setScheduleId(Integer scheduleId) {
this.scheduleId = scheduleId;
}
public String getTypeId() {
return typeId;
}
public void setTypeId(String typeId) {
this.typeId = typeId;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public Date getCreationTime() {
return creationTime;
}
public void setCreationTime(Date creationTime) {
this.creationTime = creationTime;
}
public String getModifiedBy() {
return modifiedBy;
}
public void setModifiedBy(String modifiedBy) {
this.modifiedBy = modifiedBy;
}
public Date getModificationTime() {
return modificationTime;
}
public void setModificationTime(Date modificationTime) {
this.modificationTime = modificationTime;
}
public int getPropConfirmSequence() {
return propConfirmSequence;
}
public void setPropConfirmSequence(int propConfirmSequence) {
this.propConfirmSequence = propConfirmSequence;
}
public String getAddonType() {
return addonType;
}
public void setAddonType(String addonType) {
this.addonType = addonType;
}
public String getNewCourseProposalId() {
return newCourseProposalId;
}
public void setNewCourseProposalId(String newCourseProposalId) {
this.newCourseProposalId = newCourseProposalId;
}
public ProposedSubjects getProposedSubjects() {
return proposedSubjects;
}
public void setProposedSubjects(ProposedSubjects proposedSubjects) {
this.proposedSubjects = proposedSubjects;
this.subjectPropId = proposedSubjects.subject_prop_id;
}
public int getProposedCourseCompTypeId() {
return proposedCourseCompTypeId;
}
public void setProposedCourseCompTypeId(int proposedCourseCompTypeId) {
this.proposedCourseCompTypeId = proposedCourseCompTypeId;
}
public int getSubjectPropId() {
return subjectPropId;
}
public void setSubjectPropId(int subjectPropId) {
this.subjectPropId = subjectPropId;
}
}
.
.
.
public Map subjectProposalFormSubmit(ProposedSubjects form) {
synchronized (this) {
System.out.println("TESTING THE FORM BEFORE SETTING : " + form.toString());
Integer currID = form.getSubject_prop_id();
if (currID > 0) {
} else {
String Prop_sub_maxID = subProposal.getMaxID();
if (Prop_sub_maxID == null) {
Prop_sub_maxID = "1";
} else {
Prop_sub_maxID = String.valueOf(Integer.parseInt(Prop_sub_maxID) + 1);
}
form.setSubject_prop_id(Integer.parseInt(Prop_sub_maxID) + 1);
}
Integer Comp_sub_maxID = compTypeRepo.getMaxID();
if (Comp_sub_maxID == null) {
Comp_sub_maxID = 1;
} else {
Comp_sub_maxID = Comp_sub_maxID + 1;
}
ProposedSubjectsPK id = new ProposedSubjectsPK();
id.setSubjectPropId(form.getSubject_prop_id());
id.setInstituteId(InstituteContextHolder.getInstitute());
List<ProposedCourseCompType> components = form.getProposedCourseCompTypeCollection();
List<ProposedCourseCompType> settingList = new ArrayList<>();
for (ProposedCourseCompType Component : components) {
if (Component.getProposedCourseCompTypeId() > 0) {
if (!(Component.getScheduleId() == null)) {
Component.setProposedSubjects(form);
settingList.add(Component);
}
} else {
if (!(Component.getScheduleId() == null)) {
Component.setProposedCourseCompTypeId(Comp_sub_maxID++);
Component.setProposedSubjects(form);
settingList.add(Component);
}
}
}
String teachers = form.getTeacherEc();
if (teachers.contains(",")) {
String[] teacher_list = teachers.split(",");
for (int i = 0; i < teacher_list.length; i++) {
if (empMasterRepo.findByEmpno(teacher_list[i]).isEmpty()) {
Map map = new HashMap();
map.put("teacherEc", teacher_list[i] + ": Not a valid teacher ID");
return map;
}
}
}
String Prereq_expression = form.getPrerequisite();
if (!Prereq_expression.isEmpty()) {
try {
if (validate(Prereq_expression)) {
} else {
Map map = new HashMap();
map.put("expression_list", Prereq_expression + ": Not a valid Expression");
return map;
}
} catch (Exception ex) {
Logger.getLogger(AcademicService.class.getName()).log(Level.SEVERE, null, ex);
}
}
String concurrent_expression = form.getConcurrentSubjects();
if (!concurrent_expression.isEmpty()) {
try {
if (validate(concurrent_expression)) {
} else {
Map map = new HashMap();
map.put("expression_list", Prereq_expression + ": Not a valid Expression");
return map;
}
} catch (Exception ex) {
Logger.getLogger(AcademicService.class.getName()).log(Level.SEVERE, null, ex);
}
}
form.setProposedCourseCompTypeCollection(settingList);
ProposedSubjects entity = new ProposedSubjects();
try {
subProposal.findById(id).map(post -> {
post.setConcurrentSubjects(form.getConcurrentSubjects());
post.setConfirmFlag(form.getConfirmFlag());
post.setConfirm_seq(form.getConfirm_seq());
post.setContractHour(form.getContractHour());
post.setCorrectionNote(form.getCorrectionNote());
post.setCredit(form.getCredit());
post.setDeptcode(form.getDeptcode());
post.setDocId(form.getDocId());
post.setEvaluationCommittee(form.getEvaluationCommittee());
post.setL(form.getL());
post.setLevelCode(form.getLevelCode());
post.setNewCourseFlag(form.getNewCourseFlag());
post.setObjectives(form.getObjectives());
post.setOverlapedSubject(form.getOverlapedSubject());
post.setP(form.getP());
post.setPercentOverlap(form.getPercentOverlap());
post.setPrerequisite(form.getPrerequisite());
post.setProposalcode(form.getProposalcode());
for (int i = 0; i < post.getProposedCourseCompTypeCollection().size(); i++) {
post.getProposedCourseCompTypeCollection().get(i).setAddonType(form.getProposedCourseCompTypeCollection().get(i).getAddonType());
post.getProposedCourseCompTypeCollection().get(i).setCourseId(form.getProposedCourseCompTypeCollection().get(i).getCourseId());
post.getProposedCourseCompTypeCollection().get(i).setProposedCourseCompTypeId(form.getProposedCourseCompTypeCollection().get(i).getProposedCourseCompTypeId());
post.getProposedCourseCompTypeCollection().get(i).setProposedSubjects(form);
post.getProposedCourseCompTypeCollection().get(i).setScheduleId(form.getProposedCourseCompTypeCollection().get(i).getScheduleId());
post.getProposedCourseCompTypeCollection().get(i).setSubjectPropId(form.getProposedCourseCompTypeCollection().get(i).getSubjectPropId());
post.getProposedCourseCompTypeCollection().get(i).setTypeId(form.getProposedCourseCompTypeCollection().get(i).getTypeId());
}
post.setReasonForNewSub(form.getReasonForNewSub());
post.setReferenceBooks(form.getReferenceBooks());
post.setScheduleCode(form.getScheduleCode());
post.setScheduleType(form.getScheduleType());
post.setStartSession(form.getStartSession());
post.setStatus(form.getStatus());
post.setSubjectContents(form.getSubjectContents());
post.setSubjectName(form.getSubjectName());
post.setSubjectType(form.getSubjectType());
post.setSubject_prop_id(form.getSubject_prop_id());
post.setSubno(form.getSubno());
post.setT(form.getT());
post.setTeacherEc(form.getTeacherEc());
post.setTextBooks(form.getTextBooks());
post.setWorkflowid(form.getWorkflowid());
System.out.println("posting");
ProposedSubjects P = subProposal.save(post);
// subProposal.saveOrUpdate(post);
System.out.println("posted: " + P.toString());
return P;
}).orElse(entity = subProposal.save(form));
} catch (Exception ex) {
Logger.getLogger(AcademicService.class.getName()).log(Level.SEVERE, null, ex);
}
Map map = new HashMap();
map.put("Success", "Data Successfully Submitted");
return map;
}
}
.
.
.
最佳答案
注释方法subjectProposalFormSubmit中的以下行
post.setSubject_prop_id(form.getSubject_prop_id());
关于java - 主键约束违规 : Hibenate Save Method Not updating but trying to insert new row with same primary key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59150485/