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

发布于 2024-12-10 22:36:58 字数 7087 浏览 0 评论 0原文

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

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

UsersUserGroups 具有一对多关系,并且 UserGroups用户多对一

GroupsUserGroups 的关系与 Users 相同。

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

所以这个错误

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

当我选择用户和组并单击“插入”按钮时, 。用户和组不会插入到数据库表中。

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

用户模型:

    @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 + " ]";
    }

}

用户组模型:

@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;
    }
}

组模型:

    @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>

我的用户组 Bean:

   @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:

2011 年 21 月 10:15:26 上午 org.hibernate.impl.SessionFactoryObjectFactory addInstance 信息:未将工厂绑定到 JNDI,未配置 JNDI 名称 2011 年 21 月 10:15:33 上午 org.hibernate.util.JDBCExceptionReporter logExceptions 警告:SQL 错误:1452,SQLState:23000 2011 年 21 月 10:15:33 AM org.hibernate.util.JDBCExceptionReporter logExceptions 严重:不能 添加或更新子行:外键约束失败 (social.usuarios_grupos,约束fk_usuarios外键 (id_usuario) 参考usuarios(id_usuario) ON DELETE NO 更新操作 无操作)2011 年 21 日上午 10:15:33 org.hibernate.event.def.AbstractFlushingEventListener PerformExecutions 严重:无法同步数据库状态 会话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 外键约束失败(social.usuarios_grupos,CONSTRAINT fk_usuarios 外键 (id_usuario) 参考 usuarios (id_usuario) 删除时不执行任何操作,更新时不执行任何操作)

I've been at this problem for 2 weeks now, and I've come across several solutions on Stackoverflow, and other forums, but I am still unable to find a right answer.

I have 3 Tables in my Database: Users, UserGroups, and Groups.

The Users have a one-to-many relationship with UserGroups, and UserGroups
many-to-one with Users.

The relationship with Groups and UserGroups is the same as Users.

I am using JSF + HIBERNATE + PrimeFaces to construct my application. So I have 3 Data tables in my view - 1 displays the list of users in my database, the other displays the list of groups, and lastly the UserGroup data table displays the list of users and groups.

so this error

java.sql.BatchUpdateException: Cannot add or update a child row: a
foreign key constraint fails

APPEARS WHEN I select a user and a group, and I click the "Insert" button. The user and the group does not get inserted into the database table.

I do not think its a mapping error because I tried running a test class by manually inserting values into the database, and it works fine. Can anyone help me out with this?

USER model:

    @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 + " ]";
    }

}

UserGroups Model:

@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;
    }
}

Groups model:

    @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>

My UserGroups Bean:

   @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:

Out 21, 2011 10:15:26 AM
org.hibernate.impl.SessionFactoryObjectFactory addInstance
INFO: Not binding factory to JNDI, no JNDI name configured
Out 21, 2011 10:15:33 AM org.hibernate.util.JDBCExceptionReporter logExceptions WARNING: SQL
Error: 1452, SQLState: 23000 Out 21, 2011 10:15:33 AM
org.hibernate.util.JDBCExceptionReporter logExceptions SEVERE: Cannot
add or update a child row: a foreign key constraint fails
(
social.usuarios_grupos, CONSTRAINTfk_usuariosFOREIGN KEY
(
id_usuario) REFERENCESusuarios(id_usuario) ON DELETE NO
ACTION ON UPDATE NO ACTION) Out 21, 2011 10:15:33 AM

org.hibernate.event.def.AbstractFlushingEventListener
performExecutions SEVERE: Could not synchronize database state with
session org.hibernate.exception.ConstraintViolationException: Could
not execute JDBC batch update at
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at java.lang.Thread.run(Thread.java:722) Caused by:
java.sql.BatchUpdateException: Cannot add or update a child row: a
foreign key constraint fails (social.usuarios_grupos, CONSTRAINT
fk_usuarios FOREIGN KEY (id_usuario) REFERENCES usuarios
(id_usuario) ON DELETE NO ACTION ON UPDATE NO ACTION)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

郁金香雨 2024-12-17 22:36:58

请参阅 show_sql=true 生成的底层查询,

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

See the underlying generated query by show_sql=true,

The problem is you are trying to insert/update a reference which isn't exist.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文