MySQL - Foreign key in ON DELETE NO ACTION but executes ON DELETE CASCADE

2

I'm developing a system using Apache , Hibernate e MySQL . But I have a problem while deleting parent entries from a foreign key. The database should prevent the deletion, but it deletes the parent entry and all associated with it, through the foreign key (CASCADE) . A SELECT @@FOREIGN_KEY_CHECKS returns 1 showing that the check is active in MySQL . I suspect that Apache or Hibernate is disabling the check, but I do not know how.

Here's part of my bank with the two tables in question:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema dispensario
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema dispensario
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS 'dispensario' DEFAULT CHARACTER SET utf8 ;
USE 'dispensario' ;

-- -----------------------------------------------------
-- Table 'dispensario'.'estado'
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS 'dispensario'.'estado' (
  'estado_id' INT NOT NULL AUTO_INCREMENT COMMENT 'Código identificador do estado.',
  'estado_nome' VARCHAR(75) NOT NULL COMMENT 'Nome do estado.',
  'estado_uf' VARCHAR(2) NOT NULL COMMENT 'Unidade da federação do estado.',
  'estado_situacao' TINYINT(1) NOT NULL COMMENT 'Situação do estado (ativo ou inativo)',
  PRIMARY KEY ('estado_id'),
  UNIQUE INDEX 'estado_nome_UNIQUE' ('estado_nome' ASC),
  UNIQUE INDEX 'estado_uf_UNIQUE' ('estado_uf' ASC))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table 'dispensario'.'cidade'
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS 'dispensario'.'cidade' (
  'cidade_id' INT NOT NULL AUTO_INCREMENT COMMENT 'Código identificador da cidade.',
  'cidade_nome' VARCHAR(75) NOT NULL COMMENT 'Nome da cidade.',
  'cidade_estado' INT NOT NULL COMMENT 'Código do estado do qual a cidade pertence.',
  'cidade_situacao' TINYINT(1) NOT NULL COMMENT 'Situação da cidade (ativa ou inativa).',
  PRIMARY KEY ('cidade_id'),
  INDEX 'cidade_estado_idx' ('cidade_estado' ASC),
  CONSTRAINT 'fk_cidade_estado'
    FOREIGN KEY ('cidade_estado')
    REFERENCES 'dispensario'.'estado' ('estado_id')
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Data for table 'dispensario'.'estado'
-- -----------------------------------------------------
START TRANSACTION;
USE 'dispensario';
INSERT INTO 'dispensario'.'estado' ('estado_id', 'estado_nome', 'estado_uf', 'estado_situacao') VALUES (1, 'Minas Gerais', 'MG', 1);

COMMIT;


-- -----------------------------------------------------
-- Data for table 'dispensario'.'cidade'
-- -----------------------------------------------------
START TRANSACTION;
USE 'dispensario';
INSERT INTO 'dispensario'.'cidade' ('cidade_id', 'cidade_nome', 'cidade_estado', 'cidade_situacao') VALUES (1, 'Belo Horizonte', 1, 1);

COMMIT;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Checking the template class. State I found a snippet of code that might explain the problem:

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "cidadeEstado")
 private Collection<Cidade> cidadeCollection;

After commenting on the excerpt cascade = CascadeType.ALL , the deletion worked as expected.

 @OneToMany(/*cascade = CascadeType.ALL,*/ mappedBy = "cidadeEstado")
 private Collection<Cidade> cidadeCollection;

However, this Database Entity Class is automatically generated by the Netbeans IDE according to the specifications of the database. I am a beginner in Hibernate and should be leaving some option enabled or disabled during the class generation process that adds this setting. Unless these settings have to be undone manually whenever classes are generated.

    
asked by anonymous 03.04.2016 / 00:23

1 answer

0

As far as I can verify the IDE Netbeans automatically generates the Database Entity Class and sets the notation "cascade = CascadeType.ALL" to all foreign keys. In this way, Hibernate disregards database constraints cascading changes. Changing this notation manually whenever redoing the Entity Classes would be impractical.

To solve the problem, I have adopted as a good practice not to depend on the bank's restrictions to identify improper changes. Instead of trying to catch exceptions whenever an undue change was made, I checked each change before running it.

    
24.04.2016 / 19:53