2015-12-20 45 views
0

我正在執行OneToMany關係,但發生org.hibernate.exception.ConstraintViolationException:無法執行JDBC批處理更新錯誤。org.hibernate.exception.ConstraintViolationException:無法在保存hibrnate OneToMany關聯時執行JDBC批處理更新

堆棧跟蹤:

Hibernate: insert into DonorRecord (address, age, cnic, confirmPasswod, contactNumber, email, firstName, homeNumber, lastName, password, userName) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: select nextval ('hibernate_sequence') 
Hibernate: insert into BloodDonorClass (bloodType, donor_id, price, bloodId) values (?, ?, ?, ?) 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184) 
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) 
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) 
at com.ehr.dao.BloodDonorClassService.addNewDonor(BloodDonorClassService.java:38) 
at org.Webapp.resource.BloodResourceNew.addNew(BloodResourceNew.java:25) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:143) 
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:160) 
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:203) 
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:97) 
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) 
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) 
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:303) 
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:286) 
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1072) 
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:399) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into BloodDonorClass (bloodType, donor_id, price, bloodId) values ('A+', '11', '1000', '68') was aborted. Call getNextException to see the cause. 
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2621) 
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1837) 
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2754) 
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
... 51 more 

供體類別:

@Entity 
public class DonorRecord { 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
private int donorId; 
private String firstName; 
private String lastName; 
private int age; 
private String cnic; 
private String contactNumber; 
private String homeNumber; 
private String address; 
private String email; 
private String password; 
private String confirmPasswod; 
private String userName; 

@OneToMany(cascade = CascadeType.ALL,mappedBy="donor", fetch=FetchType.EAGER) 
private Set<BloodDonorClass> blood; 

public int getDonorId() { 
    return donorId; 
} 
public void setDonorId(int donorId) { 
    this.donorId = donorId; 
} 
public String getFirstName() { 
    return firstName; 
} 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 
public String getLastName() { 
    return lastName; 
} 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 
public int getAge() { 
    return age; 
} 
public void setAge(int age) { 
    this.age = age; 
} 
public String getCnic() { 
    return cnic; 
} 
public void setCnic(String cnic) { 
    this.cnic = cnic; 
} 
public String getContactNumber() { 
    return contactNumber; 
} 
public void setContactNumber(String contactNumber) { 
    this.contactNumber = contactNumber; 
} 
public String getHomeNumber() { 
    return homeNumber; 
} 
public void setHomeNumber(String homeNumber) { 
    this.homeNumber = homeNumber; 
} 

public String getEmail() { 
    return email; 
} 
public void setEmail(String email) { 
    this.email = email; 
} 
public String getAddress() { 
    return address; 
} 
public void setAddress(String address) { 
    this.address = address; 
} 
public String getPassword() { 
    return password; 
} 
public void setPassword(String password) { 
    this.password = password; 
} 
public String getConfirmPasswod() { 
    return confirmPasswod; 
} 
public void setConfirmPasswod(String confirmPasswod) { 
    this.confirmPasswod = confirmPasswod; 
} 
public String getUserName() { 
    return userName; 
} 
public void setUserName(String userName) { 
    this.userName = userName; 
} 
public Set<BloodDonorClass> getBlood() { 
    return blood; 
} 
public void setBlood(Set<BloodDonorClass> blood) { 
    this.blood = blood; 
} 
} 

血液類別:

@Entity 
public class BloodDonorClass { 

@Id @GeneratedValue(strategy=GenerationType.AUTO) 
private int bloodId; 
private String bloodType; 
private int price; 

@ManyToOne 
@JoinColumn(name="donor_id") 
private DonorRecord donor; 

public int getBloodId() { 
    return bloodId; 
} 
public void setBloodId(int bloodId) { 
    this.bloodId = bloodId; 
} 
public String getBloodType() { 
    return bloodType; 
} 
public void setBloodType(String bloodType) { 
    this.bloodType = bloodType; 
} 
public int getPrice() { 
    return price; 
} 
public void setPrice(int price) { 
    this.price = price; 
} 

public DonorRecord getDonor() { 
    return donor; 
} 

public void setDonor(DonorRecord donor) { 
    this.donor = donor; 
} 
} 

血液和供體對象類別:

public class BloodDonorObjectClass { 

private DonorRecord donor; 
private BloodDonorClass blood; 
public DonorRecord getDonor() { 
    return donor; 
} 
public void setDonor(DonorRecord donor) { 
    this.donor = donor; 
} 
public BloodDonorClass getBlood() { 
    return blood; 
} 
public void setBlood(BloodDonorClass blood) { 
    this.blood = blood; 
} 
} 

服務類:

public class BloodDonorClassService { 
SessionFactory sessionFactory = null; 

public BloodDonorObjectClass addNewDonor(BloodDonorObjectClass bloodDonor){ 
    try{ 
     DonorRecord donor = new DonorRecord(); 
     BloodDonorClass blood = new BloodDonorClass(); 
     blood = (BloodDonorClass)bloodDonor.getBlood(); 
     donor = (DonorRecord)bloodDonor.getDonor(); 
     blood.setDonor(donor); 
     HashSet<BloodDonorClass> bloods = new HashSet<BloodDonorClass>(); 
     bloods.add(blood); 
     donor.setBlood(bloods); 
     sessionFactory = new Configuration().configure().buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 

     session.beginTransaction(); 

     session.save(donor); 
     session.getTransaction().commit(); 
     session.close(); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
    return bloodDonor; 
} 
} 

資源類:

@Path("bloodresource") 
public class BloodResourceNew { 

BloodDonorClassService bloodService = new BloodDonorClassService(); 

@Path("new") 
@POST 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public BloodDonorObjectClass addNew(BloodDonorObjectClass blood){ 
    return bloodService.addNewDonor(blood); 
} 
} 

任何一個可以告訴我,哪裏是錯誤,我應該感謝:)

回答

0

我認爲你有一個主鍵衝突限制你的查詢。 或者您有違反外鍵約束。 試着檢查你的查詢的插入數據,看看這段代碼:

DonorRecord donor = new DonorRecord(); 
    BloodDonorClass blood = new BloodDonorClass(); 
    blood = (BloodDonorClass)bloodDonor.getBlood(); 
    donor = (DonorRecord)bloodDonor.getDonor(); 
    blood.setDonor(donor); 
    HashSet<BloodDonorClass> bloods = new HashSet<BloodDonorClass>(); 
    bloods.add(blood); 
    donor.setBlood(bloods); 
+0

Abdelhak如何反序? – Asad

+0

我怎麼能顛倒查詢的順序,你可以告訴我 – Asad

+0

我明白你在問什麼,但我如何使這個查詢順序? – Asad

相關問題