2017-03-10 16 views
0

최대 절전 모드로 새로 변경되어 최대 절전 모드 4 버전을 사용하고 있기 때문에 삭제하십시오. 다음 코드에는 주석을 사용하는 일대일 관계의 간단한 예가 포함되어 있습니다. 부모 개체를 삭제하려고하면 외래 키 제약 조건 예외가 throw됩니다. 나는 이것을 달성하는 방법에 붙어 있고 혼란 스럽다. 이벤트 캐스케이드 타입을 모두 사용했습니다. 실수를 바로 잡으십시오.최대 절전 모드에서 1 대 1 관계를 사용하여 삭제

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 


    @Entity 
    @Table(name="students") 

public class Student { 
@Id 
@Column(name="student_id") 
private long studentId=0; 

@Column(name="sname",length=15) 
private String studentName=null; 

@Column(name="grp",length=15) 
private String grp=null; 

public long getStudentId() { 
    return studentId; 
} 

public void setStudentId(long studentId) { 
    this.studentId = studentId; 
} 

public String getStudentName() { 
    return studentName; 
} 

public void setStudentName(String studentName) { 
    this.studentName = studentName; 
} 

public String getGrp() { 
    return grp; 
} 

public void setGrp(String grp) { 
    this.grp = grp; 
} 
} 

이것은 데이터베이스에 삽입하고 업데이트하는 데 사용되는 상위 클래스입니다.

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.Column; 
import javax.persistence.FetchType; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 
import javax.persistence.Id; 
import javax.persistence.Table; 


    @Entity 
    @Table(name="address") 

public class Address { 
@Id 
@Column(name="address_id") 
private long addressId=0; 

@Column(name="place",length=30) 
private String place=null; 

@OneToOne(targetEntity=Student.class,fetch=FetchType.EAGER , cascade=CascadeType.ALL, orphanRemoval=true) 
@JoinColumn(name="stud_id",referencedColumnName="student_id") 

private Student parent; 

public long getAddressId() { 
    return addressId; 
} 

public void setAddressId(long addressId) { 
    this.addressId = addressId; 
} 

public String getPlace() { 
    return place; 
} 

public void setPlace(String place) { 
    this.place = place; 
} 

public Student getParent() { 
    return parent; 
} 

public void setParent(Student parent) { 
    this.parent = parent; 
} 
} 

다음과 같은 방법으로 개체를 삭제할 수 있습니다. 그러나 나는 예외를 얻고있다. 부모 개체와 관련된 자식 레코드를 삭제하는 방법?

public void deleteStudentDao(long studentId) throws Exception{ 
    Session session=null; 
    try{ 

     if(studentId >0 && factory!=null 
       && !factory.isClosed()){ 
      session=factory.openSession(); 
      session.beginTransaction(); 

      Student student=new Student(); 
      student.setStudentId(studentId); 

      Address address=new Address(); 
      address.setParent(student); 

      session.delete(address); 
      session.getTransaction().commit(); 
      System.out.println("The Student "+studentId+" detail deleted"); 
     } 
    }catch(HibernateException e){ 
     session.getTransaction().rollback(); 
     throw e; 
    }finally{ 
     if(session!=null){ 
      session.close(); 
     } 
    } 
} 

예외 그런

ERROR: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`address`, CONSTRAINT `FK_4ok3rcn3mnfl5ma2wuwvkluuo` FOREIGN KEY (`stud_id`) REFERENCES `students` (`student_id`)) 
    Mar 10, 2017 10:50:34 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release 
    INFO: HHH000010: On release of batch it still contained JDBC statements 
    org.hibernate.exception.ConstraintViolationException: could not execute statement 
     at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211) 
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3400) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3630) 
    at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:114) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) 
    at com.mv.dao.StudentDetailDAO.deleteStudentDao(StudentDetailDAO.java:98) 
    at com.mv.studentutil.StudentRelationalUtil.deleteStudentUtil(StudentRelationalUtil.java:56) 
    at com.mv.studentmodifier.StudentModifier.main(StudentModifier.java:54) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`address`, CONSTRAINT `FK_4ok3rcn3mnfl5ma2wuwvkluuo` FOREIGN KEY (`stud_id`) REFERENCES `students` (`student_id`)) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:408) 
    at com.mysql.jdbc.Util.getInstance(Util.java:383) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1049) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4226) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4158) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2840) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2334) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2262) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2246) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) 
    ... 15 more 
+0

http://stackoverflow.com/questions/19678797/how-to-update-and-delete-a-record-in-hibernate-one : 여기

는 당신이 시도 할 수있는 코드 이 대답을 통해 1 대 1 매핑을 살펴보십시오 – Murad

+0

예외 스택 추적을 게시하십시오 – Chaitanya

+0

감사 chiatanya. 그것은 작동하고 당신은 내 하루를 저장했습니다 –

답변

1

당신은해야하지 delete 주소입니다. 귀하의 경우 학생 & 주소 사이에 양방향 관계가 있어야합니다.

@Entity 
@Table(name = "students")  
public class Student { 
    ...  
    // Add this property with getter & setter methods in your Student class. 
    @OneToOne(mappedBy="parent") 
    private Address address; 

    ... 

} 

는 이제 삭제 방법에 다음 주소 항목을 삭제 한 후 학생 단체에서 학생의 주소를 가져, 그 ID를 기반으로 DB에서 학생 엔티티를 얻을. 이것은 캐스케이드 특성 때문에 주소와 학생을 삭제합니다.

try { 

      if (studentId > 0 && factory != null && !factory.isClosed()) { 
       session = factory.openSession(); 
       session.beginTransaction(); 

       Student student = (Student) session.get(Student.class, studentId); 
       session.delete(student.getAddress()); 

       /*Student student=new Student(); 
       student.setStudentId(studentId); 

       Address address=new Address(); 
       address.setParent(student); 

       session.delete(address);*/ 

       session.getTransaction().commit(); 
       System.out.println("The Student " + studentId + " detail deleted"); 
      } 
+0

당신이 말했듯이 나는 변화를 만들었습니다. 그러나 여전히 예외가 발생합니다. 여전히 부모 객체 만 처리합니다. –

+0

그래도 문제가 해결되지 않으면 문제를 해결해야합니다. 그러면 오류 스택 트레이스를 다시 게시하십시오. – Chaitanya

+0

예. 어떻게 작동하는지 설명해 주시겠습니까? 삽입 또는 업데이트와 같은 다른 프로세스가 발생합니다. 왜 부모 객체에 mappedBy를 구성해야합니까? –