Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring HibernateTemplate休眠一对多更新_Java_Spring_Hibernate - Fatal编程技术网

Java 使用Spring HibernateTemplate休眠一对多更新

Java 使用Spring HibernateTemplate休眠一对多更新,java,spring,hibernate,Java,Spring,Hibernate,AfpProcessDetail public class AfpProcessSummaryDetail implements Serializable { private String srNo; private String fileName; private String status; private String location; private String comments; private Character convertStatus; private AfpProces

AfpProcessDetail

public class AfpProcessSummaryDetail implements Serializable {

private String srNo;
private String fileName;
private String status;
private String location;
private String comments;
private Character convertStatus;
private AfpProcessDetail afpProcessDetail;

public AfpProcessSummaryDetail() {
}

public AfpProcessSummaryDetail(String srNo, String fileName, String status, String location, String comments,
        AfpProcessDetail afpProcessDetail) {
    this.srNo = srNo;
    this.fileName = fileName;
    this.status = status;
    this.location = location;
    this.comments = comments;
    this.afpProcessDetail = afpProcessDetail;
}

@ManyToOne
@JoinColumn(name = "PROCESSDETAIL")
public AfpProcessDetail getAfpProcessDetail() {
    return afpProcessDetail;
}
公共类AfpProcessDetail实现可序列化{
私有字符串processID;
私有字符串processDate;
私有整数文件计数;
私有整数成功计数;
私有整数故障计数;
个性活跃;
私有集processSummaryDetails=新哈希集(0);
公共AfpProcessDetail(){
}
公共AfpProcessDetail(字符串processID、字符串processDate、整数fileCount、整数successCount、,
整数故障计数){
this.processID=processID;
this.processDate=processDate;
this.fileCount=fileCount;
this.successCount=成功计数;
this.failureCount=故障计数;
}
公共AfpProcessDetail(字符串processID、字符串processDate、整数fileCount、整数successCount、,
整数故障计数,设置进程摘要详细信息){
this.processID=processID;
this.processDate=processDate;
this.fileCount=fileCount;
this.successCount=成功计数;
this.failureCount=故障计数;
this.processSummaryDetails=processSummaryDetails;
}
@列(name=“FAILURECOUNT”)
公共整数getFailureCount(){
返回失败计数;
}
public void setFailureCount(整数failureCount){
this.failureCount=故障计数;
}
@列(name=“FILECOUNT”)
公共整数getFileCount(){
返回文件计数;
}
public void setFileCount(整数fileCount){
this.fileCount=fileCount;
}
@列(name=“PROCESSDATE”)
公共字符串getProcessDate(){
返回处理日期;
}
public void setProcessDate(字符串processDate){
this.processDate=processDate;
}
@身份证
@列(name=“PROCESSID”,unique=true,nullable=false)
公共字符串getProcessID(){
返回processID;
}
public void setProcessID(字符串processID){
this.processID=processID;
}
@列(name=“successcount”)
公共整数getSuccessCount(){
返回成功计数;
}
public void setSuccessCount(整数successCount){
this.successCount=成功计数;
}
@JoinColumn(name=“PROCESSDETAIL”)
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
公共集getProcessSummaryDetails(){
返回流程摘要详细信息;
}
public void setProcessSummaryDetails(设置processSummaryDetails){
this.processSummaryDetails=processSummaryDetails;
}
更新代码

public class AfpProcessDetail implements Serializable {

private String processID;
private String processDate;
private Integer fileCount;
private Integer successCount;
private Integer failureCount;
private Character active;
private Set<AfpProcessSummaryDetail> processSummaryDetails = new HashSet<AfpProcessSummaryDetail>(0);

public AfpProcessDetail() {
}

public AfpProcessDetail(String processID, String processDate, Integer fileCount, Integer successCount,
        Integer failureCount) {
    this.processID = processID;
    this.processDate = processDate;
    this.fileCount = fileCount;
    this.successCount = successCount;
    this.failureCount = failureCount;
}

public AfpProcessDetail(String processID, String processDate, Integer fileCount, Integer successCount,
        Integer failureCount, Set<AfpProcessSummaryDetail> processSummaryDetails) {
    this.processID = processID;
    this.processDate = processDate;
    this.fileCount = fileCount;
    this.successCount = successCount;
    this.failureCount = failureCount;
    this.processSummaryDetails = processSummaryDetails;
}

@Column(name = "FAILURECOUNT")
public Integer getFailureCount() {
    return failureCount;
}

public void setFailureCount(Integer failureCount) {
    this.failureCount = failureCount;
}

@Column(name = "FILECOUNT")
public Integer getFileCount() {
    return fileCount;
}

public void setFileCount(Integer fileCount) {
    this.fileCount = fileCount;
}

@Column(name = "PROCESSDATE")
public String getProcessDate() {
    return processDate;
}

public void setProcessDate(String processDate) {
    this.processDate = processDate;
}

@Id
@Column(name = "PROCESSID", unique = true, nullable = false)
public String getProcessID() {
    return processID;
}

public void setProcessID(String processID) {
    this.processID = processID;
}

@Column(name = "SUCESSCOUNT")
public Integer getSuccessCount() {
    return successCount;
}

public void setSuccessCount(Integer successCount) {
    this.successCount = successCount;
}

@JoinColumn(name="PROCESSDETAIL")
@OneToMany(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
public Set<AfpProcessSummaryDetail> getProcessSummaryDetails() {
    return processSummaryDetails;
}

public void setProcessSummaryDetails(Set<AfpProcessSummaryDetail> processSummaryDetails) {
    this.processSummaryDetails = processSummaryDetails;
}
公共字符串更新摘要详细信息(查看文件、字符串代码ID){
if(viewFile!=null&&codeID!=null){
HibernateTemplate transactionTemplate=新的HibernateTemplate(sessionFactory,true);
对象结果=transactionTemplate.execute(新的HibernateCallback(){
@凌驾
公共对象doInHibernate(org.hibernate.Session Session)抛出HibernateeException、SQLException{
AFPProcessSummaryDetailProcessSummary=null,newProcessSummary=null;
AfpProcessDetail processDetail=(AfpProcessDetail)session.get(AfpProcessDetail.class,codeID);
List fileList=viewFile.getFileList();
Set setProcessSummary=newhashset();
Set modSetProcessSummary=new HashSet();
setProcessSummary=processDetail.getProcessSummaryDetails();
迭代器itrProcessSumm=setProcessSummary.Iterator();
int srNo=0;
while(itrProcessSumm.hasNext()){
processSummary=(AfpProcessSummaryDetail)itrProcessSummary.next();
用于(文件属性文件属性:文件列表){
newProcessSummary=新的AfpProcessSummaryDetail();
newProcessSummary.setSrNo(代码ID+“”+srNo);
newProcessSummary.setFileName(fileProperty.getName());
newProcessSummary.setLocation(fileProperty.getPath());
newProcessSummary.setComments(fileProperty.getComment());
newProcessSummary.setStatus(fileProperty.getStatus());
newProcessSummary.setConvertStatus(fileProperty.getConvertStatus());
newProcessSummary.setAfpProcessDetail(processDetail);
modSetProcessSummary.add(newProcessSummary);
/*if(processSummary.getFileName().trim().equals(fileProperty.getName().trim())){
System.out.println(“删除的元素”);
itrProcessSumm.remove();
modSetProcessSummary.add(newProcessSummary);
打破
}*/
srNo++;
}
}   
//setProcessSummary.addAll(modSetProcessSummary);
processDetail.setProcessSummaryDetails(modSetProcessSummary);
processDetail.setFailureCount(viewFile.getExceptionNo());
processDetail.setSuccessCount(viewFile.getSuccessNo());
processDetail.setActive(viewFile.getActive());
transactionTemplate.flush();
合并(processDetail);
System.out.println(“更新成功”);
返回代码ID;
}
});
期望的结果

我想执行一对多更新
-AfpProcessSummaryDetail
,该更新通过Set与AfpProcessDetail相关。当我尝试替换更新的设置值时,它会尝试将主键更新为null。如果我不替换更新,则不会发生。如果我设置cascade,则会给出错误-具有相同标识符值的不同对象已与会话关联:

[com.aurionpro.convertor.dto.afpprocessummarydetail#15a236f‌​fc961]; 嵌套的异常是org.hibernate.unUniqueObjectException:a 已关联具有相同标识符值的不同对象 与会议有关public String updateSummaryDetails(ViewFile viewFile, String codeID) { if (viewFile != null && codeID != null) { HibernateTemplate transactionTemplate = new HibernateTemplate(sessionFactory, true); Object result = transactionTemplate.execute(new HibernateCallback<Object>() { @Override public Object doInHibernate(org.hibernate.Session session) throws HibernateException, SQLException { AfpProcessSummaryDetail processSummary =null,newProcessSummary =null; AfpProcessDetail processDetail = (AfpProcessDetail)session.get(AfpProcessDetail.class,codeID); List<FileProperty> fileList = viewFile.getFileList(); Set<AfpProcessSummaryDetail> setProcessSummary=new HashSet<AfpProcessSummaryDetail>(); Set<AfpProcessSummaryDetail> modSetProcessSummary=new HashSet<AfpProcessSummaryDetail>(); setProcessSummary =processDetail.getProcessSummaryDetails(); Iterator<AfpProcessSummaryDetail> itrProcessSumm=setProcessSummary.iterator(); int srNo = 0; while (itrProcessSumm.hasNext()){ processSummary =(AfpProcessSummaryDetail)itrProcessSumm.next(); for (FileProperty fileProperty : fileList) { newProcessSummary =new AfpProcessSummaryDetail(); newProcessSummary.setSrNo(codeID + "" + srNo); newProcessSummary.setFileName(fileProperty.getName()); newProcessSummary.setLocation(fileProperty.getPath()); newProcessSummary.setComments(fileProperty.getComment()); newProcessSummary.setStatus(fileProperty.getStatus()); newProcessSummary.setConvertStatus(fileProperty.getConvertStatus()); newProcessSummary.setAfpProcessDetail(processDetail); modSetProcessSummary.add(newProcessSummary); /*if (processSummary.getFileName().trim().equals(fileProperty.getName().trim())){ System.out.println("Element removed"); itrProcessSumm.remove(); modSetProcessSummary.add(newProcessSummary); break; }*/ srNo++; } } // setProcessSummary.addAll(modSetProcessSummary); processDetail.setProcessSummaryDetails(modSetProcessSummary); processDetail.setFailureCount(viewFile.getExceptionNo()); processDetail.setSuccessCount(viewFile.getSuccessNo()); processDetail.setActive(viewFile.getActive()); transactionTemplate.flush(); session.merge(processDetail); System.out.println("updated successfully"); return codeID; } });