簡體   English   中英

org.hibernate.exception.ConstraintViolationException:保存高級OneToMany替換項時無法執行JDBC批更新

[英]org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at saving hibrnate OneToMany reletionship

我正在做一個OneToMany關系,但是org.hibernate.exception.ConstraintViolationException:無法執行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);
}
}

任何人都可以告訴我,錯誤在哪里我將心存感激:)

我認為您的查詢存在主鍵沖突約束。 或者您有違反的外鍵約束。 嘗試檢查查詢的插入數據,請參見以下代碼塊:

    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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM