尝试在删除尝试失败的情况下合并实体并抛出异常“外键约束”

时间:2015-04-21 12:53:53

标签: hibernate

目标:尝试从数据库中删除一行,并将其链接到另一个表作为外键,合并实体状态为非活动

在finally块中我尝试合并实体但它抛出异常 代码:

public void deleteServiceData(Service service) {
        boolean deleteServiceException = false;
        Service entity = null;
        em = emf.createEntityManager();
        try {
            if (service != null) {
                 entity = getServiceMasterId(service);
                 em.remove(entity);
                 em.flush();
                 logger.info("Deleted");
            }
        }catch(PersistenceException e) {
            logger.error("There is an PersistenceException");
            deleteServiceException = true;
            em.clear();
        }catch(Exception e) {
            logger.error("There is an Exception");
            e.printStackTrace();

        }finally{
            logger.info("finally block execution"+deleteServiceException);
            if(deleteServiceException == true){
                Service ser = entity; 
                ser.setStatus(StatusEnum.I);
                logger.info("Service ready to delete");
                em = emf.createEntityManager();
                em.merge(ser);
                em.flush();
            }
        }

例外:

 Cannot delete or update a parent row: a foreign key constraint fails (`devbackup`.`section`, CONSTRAINT `FKA03B0AC53771DF5C` FOREIGN KEY (`SERVICE_ID`) REFERENCES `service` (`ID`))
18:11:28,817 INFO  [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (default task-59) HHH000010: On release of batch it still contained JDBC statements
18:11:28,817 ERROR [com.icare.scheduling.ejb.ServiceEJBImpl] (default task-59) There is an PersistenceException
18:11:28,817 INFO  [com.icare.scheduling.ejb.ServiceEJBImpl] (default task-59) finally block executiontrue
18:11:28,817 INFO  [com.icare.scheduling.ejb.ServiceEJBImpl] (default task-59) Service ready to delete
18:11:28,818 INFO  [stdout] (default task-59) Hibernate: select service0_.ID as ID1_59_0_ _ from SERVICE service0_

18:11:28,818 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-59) SQL Error: 0, SQLState: null
18:11:28,818 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-59) javax.resource.ResourceException: IJ000460: Error checking for a transaction
18:11:28,818 INFO  [org.hibernate.event.internal.DefaultLoadEventListener] (default task-59) HHH000327: Error performing load command : org.hibernate.exception.GenericJDBCException: Could not open connection
18:11:28,821 ERROR [com.icare.rest.scheduling.ServiceImpl] (default task-59) There is an Exception
18:11:28,821 ERROR [stderr] (default task-59) javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not open connection

18:11:28,822 ERROR [stderr] (default task-59)   at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)

18:11:28,822 ERROR [stderr] (default task-59)   at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)

18:11:28,822 ERROR [stderr] (default task-59)   at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)

18:11:28,822 ERROR [stderr] (default task-59)   at org.hibernate.jpa.spi.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:1206)

1 个答案:

答案 0 :(得分:0)

您的服务实体有一个其他实体的引用,没有表格,我不知道那是什么,看起来像部分。假设您还想删除该引用,则需要执行以下操作之一:

  • 首先删除其他表格中的引用
  • 删除外键约束

    SET FOREIGN_KEY_CHECKS = 0;

  • 设置级联删除,如下所示:

    ALTER TABLE Service

    添加约束service_ibfk_1

    FOREIGN KEY(service_id)参考sectionservice_id

    ON DELETE CASCADE;

这种关系实际上可能与您想要的相反(删除其他实体并级联删除服务),具体取决于您要执行的操作。