ManyToMany @Embeddable MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败

时间:2016-07-26 22:30:36

标签: mysql spring hibernate jpa

我有两张桌子,当我尝试保存Usuarios Entity时,抛出

  

org.springframework.dao.DataIntegrityViolationException:无法添加或   更新子行:外键约束失败   (formato_inscripcionroles_usuario,CONSTRAINT   roles_usuario_ibfk_1外键(ID_USUARIOCLAVE_USUARIO)   参考usuariosIDCLAVE)); SQL [不适用];约束[null];   嵌套异常是   org.hibernate.exception.ConstraintViolationException:无法添加或   更新子行:外键约束失败   (formato_inscripcionroles_usuario,CONSTRAINT   roles_usuario_ibfk_1外键(ID_USUARIOCLAVE_USUARIO)   参考文献usuariosIDCLAVE))at   org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:163)     在   org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:730)     在   org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:592)     在   org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)     在   org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)        `CREATE TABLE ROLES(           CLAVE VARCHAR(10)独特的主要钥匙,           DESCRIPCION VARCHAR(50))ENGINE = INNODB;

CREATE TABLE USUARIOS( ID INT AUTO_INCREMENT,   CLAVE CHAR(10) UNIQUE,
            USUARIO VARCHAR(10),
            PASSWORD VARCHAR(10) NOT NULL,      
            CLAVE_TIPO_USUARIO CHAR(10) NOT NULL,                        
                    PRIMARY KEY(ID,CLAVE),
            FOREIGN KEY(CLAVE_TIPO_USUARIO) REFERENCES TIPO_USUARIO(CLAVE) )ENGINE=INNODB;

 CREATE TABLE ROLES(    
        CLAVE VARCHAR(10) UNIQUE PRIMARY KEY,
        DESCRIPCION VARCHAR(50)
    )ENGINE=INNODB;

 CREATE TABLE ROLES_USUARIO(    
    CLAVE_ROL VARCHAR(10) ,
    ID_USUARIO INT ,
    CLAVE_USUARIO CHAR(10) ,
    FOREIGN KEY(ID_USUARIO,CLAVE_USUARIO) REFERENCES USUARIOS(ID,CLAVE),
    FOREIGN KEY(CLAVE_ROL) REFERENCES ROLES(CLAVE)
)ENGINE=INNODB;


CREATE TABLE TIPO_USUARIO(
    CLAVE CHAR(10) PRIMARY KEY,
    NOMBRE VARCHAR(10) UNIQUE,
    DESCRIPCION VARCHAR(10)
)ENGINE=INNODB;

我的JPA模型

@Embeddable
public class UsuariosId implements java.io.Serializable {

    private int id;
    private String clave;

    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column(name = "ID" )
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "CLAVE", length = 10)
    public String getClave() {
        return this.clave;
    }

    public void setClave(String clave) {
        this.clave = clave;
    }
}

用户实体

@Entity
@Table(name = "USUARIOS", catalog = "", uniqueConstraints = @UniqueConstraint(columnNames = "CLAVE"))
public class Usuarios implements java.io.Serializable {

    private UsuariosId id;

    private Set<Roles> roles;

    //private String claveTipoUsuario;
    private List<Asigna> asigna;

    public Usuarios() {
    }

    @EmbeddedId
    @AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "ID")),
            @AttributeOverride(name = "clave", column = @Column(name = "CLAVE", unique = true, length = 10)) })
    public UsuariosId getId() {
        return this.id;
    }

    public void setId(UsuariosId id) {
        this.id = id;
    }

    @Column(name = "USUARIO", length = 10)
    public String getUsuario() {
        return this.usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    @Column(name = "PASSWORD", nullable = false, length = 10)
    public String getPassword() {
        return this.password;
    }


    @ManyToMany(targetEntity=Roles.class,
            cascade=CascadeType.ALL)
    @JoinTable(name="ROLES_USUARIO", joinColumns={@JoinColumn(name = "ID_USUARIO", referencedColumnName="ID"),
                                                  @JoinColumn(name="CLAVE_USUARIO",referencedColumnName="CLAVE")}
                                        , inverseJoinColumns={@JoinColumn(name="CLAVE_ROL",referencedColumnName="CLAVE")})  
    public Set<Roles> getRoles() {
        return roles;
    }

    public void setRoles(Set<Roles> roles) {
        this.roles = roles;
    }




@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CLAVE_TIPO_USUARIO")
    public TipoUsuario getClavetipousuario() {
        return clavetipousuario;
    }

    public void setClavetipousuario(TipoUsuario clavetipousuario) {
        this.clavetipousuario = clavetipousuario;
    }


}

角色实体

 @Entity
    @Table(name = "ROLES", catalog = "", uniqueConstraints = @UniqueConstraint(columnNames = "CLAVE"))
    public class Roles implements java.io.Serializable {

        private String clave;
        private String descripcion;
        private Set<Usuarios> usuarios;

        public Roles() {
        }

        public Roles(String clave, String descripcion) {
            this.clave = clave;
            this.descripcion = descripcion;
        }

        @Id
        @Column(name = "CLAVE", unique = true, length = 30)
        public String getClave() {
            return this.clave;
        }

        public void setClave(String clave) {
            this.clave = clave;
        }

        @Column(name = "DESCRIPCION", length = 50)
        public String getDescripcion() {
            return this.descripcion;
        }

        public void setDescripcion(String descripcion) {
            this.descripcion = descripcion;
        }

        //@MapsId("id")
        @ManyToMany(mappedBy="roles")
        public Set<Usuarios> getUsuarios() {
            return usuarios;
        }

        public void setUsuarios(Set<Usuarios> usuarios) {
            this.usuarios = usuarios;
        }
        }


  @Entity
@Table(name = "TIPO_USUARIO", catalog = "", uniqueConstraints = @UniqueConstraint(columnNames = "NOMBRE"))
public class TipoUsuario implements java.io.Serializable {

    private String clave;
    private String nombre;
    private String descripcion;
    private List<Usuarios> usuarios;

    public TipoUsuario() {
    }

    public TipoUsuario(String clave) {
        this.clave = clave;
    }

    public TipoUsuario(String clave, String nombre, String descripcion) {
        this.clave = clave;
        this.nombre = nombre;
        this.descripcion = descripcion;
    }

    @Id
    @Column(name = "CLAVE", unique = true, nullable = false, length = 10)
    public String getClave() {
        return this.clave;
    }

    public void setClave(String clave) {
        this.clave = clave;
    }

    @Column(name = "NOMBRE", unique = true, length = 10)
    public String getNombre() {
        return this.nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    @Column(name = "DESCRIPCION", length = 10)
    public String getDescripcion() {
        return this.descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    @OneToMany(mappedBy="clavetipousuario")
    public List<Usuarios> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuarios> usuarios) {
        this.usuarios = usuarios;
    }


}

My TestClass  

     @Repository
    public class UsuariosDaoTest extends TesteBase {

        private static Logger logger = LoggerFactory.getLogger(UsuariosDaoTest.class);

        Integer inicio; 
        String dato;

        @Autowired
        RolesDao rolesDao;

        @Autowired
        UsuariosDao usuariosdao;

        @Autowired
        TipoUsuarioDao tipousuariodao;

        @Test
        public void testdao(){
            assertNotNull(usuariosdao);
        }

        @Test
        public void testaddDao(){
            Roles rol1 = (Roles) rolesDao.getRolByClave("rol003");
            HashSet roles = new HashSet<Roles>();
            roles.add(rol1);
            Usuarios u = new Usuarios();                
            UsuariosId uid = new UsuariosId();
            uid.setClave("54");

            TipoUsuario tu = (TipoUsuario) tipousuariodao.getTipoUsuarioByClave("3");

            u.setId(uid);
            u.setClavetipousuario(tu);

            Serializable b1 = usuariosdao.add(u);
            u.setRoles(roles);
            usuariosdao.update(u);


        }

1 个答案:

答案 0 :(得分:0)

你的桌子看起来不正确。或者您尚未在此处发布所有创建表脚本。 没有这样的TIPO_USUARIO表。 USUARIOS表也没有任何名为CLAVE_TIPO_USUARIO的字段。