簡體   English   中英

java.sql.BatchUpdateException:無法添加或更新子行:外鍵約束失敗ERROR

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

我已經在這個問題上待了兩個星期了,在Stackoverflow和其他論壇上我遇到了幾種解決方案,但是我仍然找不到正確的答案。

我的數據庫中有3個表: UsersUserGroupsGroups

Usersone-to-many有關系UserGroups ,以及UserGroups many-to-oneUsers

與關系GroupsUserGroups是一樣的Users

我正在使用JSF + HIBERNATE + PrimeFaces來構建我的應用程序。 因此,我的視圖中有3個數據表-1個顯示數據庫中的用戶列表,另一個顯示組的列表,最后UserGroup數據表顯示用戶和組的列表。

所以這個錯誤

java.sql.BatchUpdateException:無法添加或更新子行:外鍵約束失敗

當我選擇一個用戶和一個組,然后單擊“插入”按鈕時出現。 用戶和組未插入數據庫表中。

我不認為這是一個映射錯誤,因為我嘗試通過將值手動插入數據庫來運行測試類,並且效果很好。 誰能幫我這個忙嗎?

用戶模型:

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

我的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:

2011年11月21日上午10:15:26 org.hibernate.impl.SessionFactoryObjectFactory addInstance INFO:未將工廠綁定到JNDI,未配置JNDI名稱Out 21,2011 10:15:33 AM org.hibernate.util.JDBCExceptionReporter logExceptions警告: SQL錯誤:1452 SQLSTATE:23000出21,2011上午十點15分33秒org.hibernate.util.JDBCExceptionReporter logExceptions SEVERE: Cannot add or update a child row: a foreign key constraint fails (社會. usuarios_grupos , CONSTRAINT fk_usuarios FOREIGN KEY ( id_usuario ) REFERENCES usuarios ( id_usuario ) ON DELETE NO ACTION ON UPDATE NO ACTION) Out 21, 2011 10:15:33 AM 10:15:33 org.hibernate.event.def.AbstractFlushingEventListener performExecutions嚴重:無法將數據庫狀態與會話org.hibernate同步。 exception.ConstraintViolationException:無法在org.hibernate.j的org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)的org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)處執行JDBC批更新 org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)位於org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)位於dbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253) .Thread.run(Thread.java:722)原因:java.sql.BatchUpdateException:無法添加或更新子行:外鍵約束失敗( social usuarios_grupos ,約束fk_usuarios外鍵( id_usuario )參考usuariosid_usuario )ON DELETE NO ACTION ON UPDATE NO ACTION)

通過show_sql=true查看基礎生成的查詢,

問題是您嘗試插入/更新不存在的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM