java.sql.BatchUpdateException:无法添加或更新子行:外键约束失败ERROR

时间:2011-10-21 12:24:24

标签: java hibernate jsf primefaces

我已经在这个问题上待了两个星期了,我在Stackoverflow和其他论坛上遇到过几个解决方案,但我仍然无法找到正确的答案。

我的数据库中有3个表:UsersUserGroupsGroups

Usersone-to-manyUserGroupsUserGroups的关系 many-to-one Users Groups

UserGroupsUsers的关系与 @OneToMany(mappedBy="user", targetEntity=UsuariosGrupos.class,fetch= FetchType.EAGER,cascade= CascadeType.ALL) private List<UsuariosGrupos> usuariosgruposList; public Usuarios() { } @XmlTransient public List<UsuariosGrupos> getUsuariosgruposList() { return usuariosgruposList; } public void setUsuariosgruposList(List<UsuariosGrupos> usuariosgruposList) { this.usuariosgruposList = usuariosgruposList; } @Override public int hashCode() { int hash = 0; hash += (idUsuario != null ? idUsuario.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Usuarios)) { return false; } Usuarios other = (Usuarios) object; if ((this.idUsuario == null && other.idUsuario != null) || (this.idUsuario != null && !this.idUsuario.equals(other.idUsuario))) { return false; } return true; } @Override public String toString() { return "br.model.Usuarios[ idUsuario=" + idUsuario + " ]"; } } 相同。

我使用JSF + HIBERNATE + PrimeFaces构建我的应用程序。所以我的视图中有3个数据表 - 1显示数据库中的用户列表,另一个显示组列表,最后UserGroup数据表显示用户和组列表。

所以这个错误

  

java.sql.BatchUpdateException:无法添加或更新子行:a   外键约束失败

出现在我选择用户和组时,单击“插入”按钮。用户和组未插入数据库表。

我不认为它是映射错误,因为我尝试通过手动将值插入数据库来运行测试类,并且它工作正常。任何人都可以帮我解决这个问题吗?

USER型号:

@Entity
@Table(name = "usuarios_grupos")
public class UsuariosGrupos {

    private Integer id_usuario;
    private Integer id_grupo;

    private Usuarios user;

    @ManyToOne
    @JoinColumn(name="id_usuario", insertable=false, updatable=false)
       public Usuarios getUser() {
        return user;
    }

    public void setUser(Usuarios user) {
        this.user = user;
    }

    @Id
    @GeneratedValue
    public Integer getId_grupo() {
        return id_grupo;
    }

    public void setId_grupo(Integer id_grupo) {
        this.id_grupo = id_grupo;
    }

    public Integer getId_usuario() {
        return id_usuario;
    }

    public void setId_usuario(Integer id_usuario) {
        this.id_usuario = id_usuario;
    }
}

UserGroups模型:

    @Entity
    @Table(name="grupos")

    public class Grupos {
        private long id_grupo;
        private String descricao;

        private List<UsuariosGrupos> usergroup;

        @OneToMany(mappedBy = "group", targetEntity = UsuariosGrupos.class, fetch = FetchType.EAGER,
        cascade = CascadeType.ALL)
        public List<UsuariosGrupos> getUsergroup() {
            return usergroup;
        }

        public void setUsergroup(List<UsuariosGrupos> usergroup) {
            this.usergroup = usergroup;
        }

        @Id
        @GeneratedValue
        public String getDescricao() {
            return descricao;
        }

        public void setDescricao(String descricao) {
            this.descricao = descricao;
        }

        public long getId_grupo() {
            return id_grupo;
        }

        public void setId_grupo(long id_grupo) {
            this.id_grupo = id_grupo;
        }    
    }
    `

    Index.xhtml (view) :

          <h:commandButton value="Incluir" actionListener="#{usuariosGruposBean.finishAddUsuariosGrupos}">
                            <f:param name="#{usergroups}" value="#{usergroups}"/>
                        </h:commandButton>

群组模型:

   @ManagedBean
@SessionScoped
public class UsuariosGruposBean {

    private Usuarios user;
    private UsuariosGrupos userGroups = new UsuariosGrupos();
    private UsuariosGruposDAO userDAO = new UsuariosGruposDAO();
    private UsuariosGruposDAO grpDAO = new UsuariosGruposDAO();
    private UsuariosGruposDAO userGrpDAO = new UsuariosGruposDAO();
    private List<Usuarios> listOfUsuarios;

    private List<UsuariosGrupos> listOfUserGroups;

    public List<Usuarios> getListOfUsuarios() {
        List<Usuarios> usuariosList = userDAO.retrieveUsuarios();
        listOfUsuarios = usuariosList;
        return listOfUsuarios;
    }



    public List<UsuariosGrupos> getListofUserGroups() {
        List<UsuariosGrupos> userGrpList = userGrpDAO.retrieveUsuariosGrupos();
        listOfUserGroups = userGrpList;
        return listOfUserGroups;
    }




    public Usuarios getUser() {
        return user;
    }

    public void setUser(Usuarios user) {
        this.user = user;
    }

    public UsuariosGrupos getUserGroups() {
        return userGroups;
    }

    public void setUserGroups(UsuariosGrupos userGroups) {
        this.userGroups = userGroups;
    }


    public void finishAddUsuariosGrupos() {
        userGroups.setId_usuario(62);
        userGroups.setId_grupo(2);
        userGrpDAO.saveUsuariosGrupos(userGroups);
        listOfUserGroups = null;
    }



}




    This is the error stack that I face when I attempt to add a user and a group to usergroups:

我的UserGroups Bean:

org.hibernate.util.JDBCExceptionReporter logExceptions SEVERE: Cannot
  add or update a child row: a foreign key constraint fails
  (
  

Out 21,2011 10:15:26 AM   org.hibernate.impl.SessionFactoryObjectFactory addInstance           信息:未将工厂绑定到JNDI,未配置JNDI名称           Out 21,2011 10:15:33 AM org.hibernate.util.JDBCExceptionReporter logExceptions警告:SQL   错误:1452,SQLState:23000 Out 21,2011 10:15:33 AM   . {社会{1}} {usuarios_grupos {1}} {fk_usuarios {1}} {id_usuario {1}} {USUARIOS {1}} {id_usuario {1}}   org.hibernate.event.def.AbstractFlushingEventListener   performExecutions严重:无法与数据库状态同步   session org.hibernate.exception.ConstraintViolationException:可以   不执行JDBC批量更新   org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)     在   org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)     在   org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)     在   org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)     在   org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)         在java.lang.Thread.run(Thread.java:722)引起:   java.sql.BatchUpdateException:无法添加或更新子行:a   外键约束失败(, CONSTRAINTFOREIGN KEY (,CONSTRAINT   ) REFERENCES外键(()参考) ON DELETE NO ACTION ON UPDATE NO ACTION) Out 21, 2011 10:15:33 AM   (social)在更新时不执行任何操作(

1 个答案:

答案 0 :(得分:1)

通过show_sql=true

查看基础生成的查询

问题是您正在尝试插入/更新不存在的引用。