-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: [Problem] Error "FK constraint fails" using inheritance
PostPosted: Tue Nov 30, 2010 8:34 am 
Newbie

Joined: Tue Nov 30, 2010 8:20 am
Posts: 1
Guys,

I am using "joined-subclass" type of inheritance of Hibernate, this is my xml mapping:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 29/11/2010 17:43:35 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class catalog="locadora" name="Negocio.Beans.Usuario" table="usuario">
        <id name="idUsuario" type="java.lang.Integer">
            <column name="idUsuario"/>
            <generator class="native"/>
        </id>
        <many-to-one class="Negocio.Beans.Tipousuario" fetch="select" name="tipousuario">
            <column name="TipoUsuario_idTipoUsuario" not-null="true"/>
        </many-to-one>
        <property name="login" type="string">
            <column length="35" name="login" not-null="true" unique="true"/>
        </property>
        <property name="senha" type="string">
            <column length="45" name="senha" not-null="true"/>
        </property>
        <property name="nome" type="string">
            <column length="60" name="nome" not-null="true"/>
        </property>
        <joined-subclass catalog="locadora" name="Negocio.Beans.Cliente" table="cliente">
            <key column="Usuario_idUsuario"/>
            <property name="idCliente" type="java.lang.Integer">
                <column name="idCliente" unique = "true"/>
            </property>
            <property name="telefoneResidencial" type="string">
                <column length="20" name="telefoneResidencial" not-null="true"/>
            </property>
            <property name="telefoneCelular" type="string">
                <column length="20" name="telefoneCelular"/>
            </property>
            <property name="email" type="string">
                <column length="40" name="email"/>
            </property>
            <property name="dataNascimento" type="date">
                <column length="10" name="dataNascimento" not-null="true"/>
            </property>
            <property name="endereco" type="string">
                <column length="250" name="endereco" not-null="true"/>
            </property>
            <property name="rg" type="string">
                <column length="25" name="rg" not-null="true" unique="true"/>
            </property>
            <property name="cpf" type="string">
                <column length="25" name="cpf" not-null="true" unique="true"/>
            </property>
            <property name="sexo" type="char">
                <column length="1" name="sexo" not-null="true"/>
            </property>
            <property name="pendencia" type="boolean">
                <column name="pendencia" not-null="true"/>
            </property>
            <set inverse="true" name="reservas">
                <key>
                    <column name="Cliente_idCliente" not-null="true"/>
                </key>
                <one-to-many class="Negocio.Beans.Reserva"/>
            </set>
            <set inverse="true" name="dependentes">
                <key>
                    <column name="Cliente_idCliente" not-null="true"/>
                </key>
                <one-to-many class="Negocio.Beans.Dependente"/>
            </set>
        </joined-subclass>
        <joined-subclass catalog="locadora" name="Negocio.Beans.Administrador" table="administrador">
            <key column="Usuario_idUsuario"/>
            <property name="idAdministrador" type="java.lang.Integer">
                <column name="idAdministrador" unique = "true" />
            </property>
        </joined-subclass>
        <joined-subclass catalog="locadora" name="Negocio.Beans.Funcionario" table="funcionario">
            <key column="Usuario_idUsuario"/>
            <property name="idFuncionario" type="java.lang.Integer">
                <column name="idFuncionario" unique = "true" />
            </property>
            <property name="sexo" type="char">
                <column length="1" name="sexo" not-null="true"/>
            </property>
            <property name="telefone" type="string">
                <column length="20" name="telefone" not-null="true"/>
            </property>
            <property name="carteiraTrabalho" type="string">
                <column length="45" name="carteiraTrabalho" not-null="true" unique="true"/>
            </property>
            <set inverse="true" name="vendas">
                <key>
                    <column name="Funcionario_idFuncionario" not-null="true"/>
                </key>
                <one-to-many class="Negocio.Beans.Venda"/>
            </set>
            <joined-subclass catalog="locadora" name="Negocio.Beans.Gerente" table="gerente">
                <key column="Funcionario_idFuncionario"/>
                <property name="idGerente" type="java.lang.Integer">
                    <column name="idGerente" unique = "true" />
                </property>
            </joined-subclass>
        </joined-subclass>
    </class>
</hibernate-mapping>



Now My POJOs.


Code:
package Negocio.Beans;
// Generated 29/11/2010 21:10:28 by Hibernate Tools 3.2.1.GA



/**
* Usuario generated by hbm2java
*/
public class Usuario implements java.io.Serializable {


    private Integer idUsuario;
    private Tipousuario tipousuario;
    private String login;
    private String senha;
    private String nome;

    public Usuario() {
    }

    public Usuario(Tipousuario tipousuario, String login, String senha, String nome) {
        this.tipousuario = tipousuario;
        this.login = login;
        this.senha = senha;
        this.nome = nome;
    }

    public Integer getIdUsuario() {
        return this.idUsuario;
    }

    public void setIdUsuario(Integer idUsuario) {
        this.idUsuario = idUsuario;
    }

    public Tipousuario getTipousuario() {
        return this.tipousuario;
    }

    public void setTipousuario(Tipousuario tipousuario) {
        this.tipousuario = tipousuario;
    }

    public String getLogin() {
        return this.login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return this.senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getNome() {
        return this.nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}


Code:
package Negocio.Beans;
// Generated 29/11/2010 21:10:28 by Hibernate Tools 3.2.1.GA

import java.util.HashSet;
import java.util.Set;

/**
* Funcionario generated by hbm2java
*/
public class Funcionario extends Usuario implements java.io.Serializable {

    private Integer idFuncionario;
    private char sexo;
    private String telefone;
    private String carteiraTrabalho;
    private Set vendas = new HashSet(0);

    public Funcionario() {
    }

    public Funcionario(char sexo, String telefone, String carteiraTrabalho, Tipousuario tipousuario, String login, String senha, String nome) {
        super(tipousuario, login, senha, nome);
        this.sexo = sexo;
        this.telefone = telefone;
        this.carteiraTrabalho = carteiraTrabalho;
    }

    public Funcionario(char sexo, String telefone, String carteiraTrabalho, Set vendas, Tipousuario tipousuario, String login, String senha, String nome) {
        super(tipousuario, login, senha, nome);
        this.sexo = sexo;
        this.telefone = telefone;
        this.carteiraTrabalho = carteiraTrabalho;
        this.vendas = vendas;
    }

    public Integer getIdFuncionario() {
        return this.idFuncionario;
    }

    public void setIdFuncionario(Integer idFuncionario) {
        this.idFuncionario = idFuncionario;
    }

    public char getSexo() {
        return this.sexo;
    }

    public void setSexo(char sexo) {
        this.sexo = sexo;
    }

    public String getTelefone() {
        return this.telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getCarteiraTrabalho() {
        return this.carteiraTrabalho;
    }

    public void setCarteiraTrabalho(String carteiraTrabalho) {
        this.carteiraTrabalho = carteiraTrabalho;
    }

    public Set getVendas() {
        return this.vendas;
    }

    public void setVendas(Set vendas) {
        this.vendas = vendas;
    }
}


package Negocio.Beans;
// Generated 29/11/2010 21:10:28 by Hibernate Tools 3.2.1.GA

import java.util.Set;

/**
* Gerente generated by hbm2java
*/
public class Gerente extends Funcionario implements java.io.Serializable {

    private Integer idGerente;

    public Gerente() {
    }

    public Gerente(char sexo, String telefone, String carteiraTrabalho, Tipousuario tipousuario, String login, String senha, String nome) {
        super(sexo, telefone, carteiraTrabalho, tipousuario, login, senha, nome);
    }

    public Gerente(char sexo, String telefone, String carteiraTrabalho, Set vendas, Tipousuario tipousuario, String login, String senha, String nome) {
        super(sexo, telefone, carteiraTrabalho, vendas, tipousuario, login, senha, nome);
    }

    public Integer getIdGerente() {
        return this.idGerente;
    }

    public void setIdGerente(Integer idGerente) {
        this.idGerente = idGerente;
    }
}





I get this messages and errors:

Hibernate: insert into locadora.tipousuario (textoTipo) values (?)
Hibernate: insert into locadora.tipousuario (textoTipo) values (?)
Hibernate: insert into locadora.usuario (TipoUsuario_idTipoUsuario, login, senha, nome) values (?, ?, ?, ?)
Hibernate: insert into locadora.administrador (idAdministrador, Usuario_idUsuario) values (?, ?)
Hibernate: insert into locadora.usuario (TipoUsuario_idTipoUsuario, login, senha, nome) values (?, ?, ?, ?)
Hibernate: insert into locadora.funcionario (idFuncionario, sexo, telefone, carteiraTrabalho, Usuario_idUsuario) values (?, ?, ?, ?, ?)
Hibernate: insert into locadora.gerente (idGerente, Funcionario_idFuncionario) values (?, ?)
30/11/2010 00:40:21 org.hibernate.util.JDBCExceptionReporter logExceptions
AVISO: SQL Error: 1452, SQLState: 23000
30/11/2010 00:40:21 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: Cannot add or update a child row: a foreign key constraint fails (`locadora`.`gerente`, CONSTRAINT `fk_Gerente_Funcionario1` FOREIGN KEY (`Funcionario_idFuncionario`) REFERENCES `funcionario` (`idFuncionario`) ON DELETE NO ACTION ON UPDATE NO ACTION)


Using lo4j:

Code:
Hibernate:
    insert
    into
        locadora.usuario
        (TipoUsuario_idTipoUsuario, login, senha, nome)
    values
        (?, ?, ?, ?)
02:49:31,200 TRACE IntegerType:133 - binding '3' to parameter: 1
02:49:31,200 TRACE StringType:133 - binding 'lalala' to parameter: 2
02:49:31,200 TRACE StringType:133 - binding '2ea3' to parameter: 3
02:49:31,200 TRACE StringType:133 - binding 'joaoeae' to parameter: 4
Hibernate:
    insert
    into
        locadora.funcionario
        (idFuncionario, sexo, telefone, carteiraTrabalho, Usuario_idUsuario)
    values
        (?, ?, ?, ?, ?)
02:49:31,216 TRACE IntegerType:126 - binding null to parameter: 1
02:49:31,216 TRACE CharacterType:133 - binding 'M' to parameter: 2
02:49:31,216 TRACE StringType:133 - binding '3323ae3' to parameter: 3
02:49:31,216 TRACE StringType:133 - binding '323ea24ae' to parameter: 4
02:49:31,216 TRACE IntegerType:133 - binding '18' to parameter: 5
Hibernate:
    insert
    into
        locadora.gerente
        (idGerente, Funcionario_idFuncionario)
    values
        (?, ?)
02:49:31,216 TRACE IntegerType:126 - binding null to parameter: 1
02:49:31,216 TRACE IntegerType:133 - binding '18' to parameter: 2
02:49:31,262  WARN JDBCExceptionReporter:77 - SQL Error: 1452, SQLState: 23000
02:49:31,262 ERROR JDBCExceptionReporter:78 - Cannot add or update a child row: a foreign key constraint fails (`locadora`.`gerente`, CONSTRAINT `fk_Gerente_Funcionario1` FOREIGN KEY (`Funcionario_idFuncionario`) REFERENCES `funcionario` (`idFuncionario`) ON DELETE NO ACTION ON UPDATE NO ACTION)


This error happens because the hibernate use the "id_Usuario" for collum "Funcionario_idFuncionario on Gerente's Table. I dont know why hibernate do this, but I can send for my database an object of "Funcionario", and the Hibernate insert first in Usuario, and then insert in Funcionario using the id_Usuario(FK), it works great!But when i am using two levels of inheritance i cant do this :( and get this error:

My tables:

Code:

[code]CREATE  TABLE IF NOT EXISTS `locadora`.`Funcionario` (
  `idFuncionario` INT NOT NULL AUTO_INCREMENT ,
  `sexo` CHAR NOT NULL ,
  `telefone` VARCHAR(20) NOT NULL ,
  `carteiraTrabalho` VARCHAR(45) NOT NULL ,
  `Usuario_idUsuario` INT NOT NULL ,
  PRIMARY KEY (`idFuncionario`) ,
  INDEX `fk_Funcionario_Usuario1` (`Usuario_idUsuario` ASC) ,
  UNIQUE INDEX `carteiraTrabalho_UNIQUE` (`carteiraTrabalho` ASC) ,
  CONSTRAINT `fk_Funcionario_Usuario1`
    FOREIGN KEY (`Usuario_idUsuario` )
    REFERENCES `locadora`.`Usuario` (`idUsuario` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `locadora`.`Gerente`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `locadora`.`Gerente` (
  `idGerente` INT NOT NULL AUTO_INCREMENT ,
  `Funcionario_idFuncionario` INT NOT NULL ,
  PRIMARY KEY (`idGerente`) ,
  INDEX `fk_Gerente_Funcionario1` (`Funcionario_idFuncionario` ASC) ,
  CONSTRAINT `fk_Gerente_Funcionario1`
    FOREIGN KEY (`Funcionario_idFuncionario` )
    REFERENCES `locadora`.`Funcionario` (`idFuncionario` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = big5
COLLATE = big5_bin;
[/code]


If you can, help me please ;)


Greetings!



Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.