java.sql.BatchUpdateException: не удается добавить или обновить дочернюю строку: ошибка сбоя ограничения внешнего ключа

#java #hibernate #jsf #primefaces

#java #спящий режим #jsf #primefaces

Вопрос:

Я занимаюсь этой проблемой уже 2 недели, и я столкнулся с несколькими решениями на Stackoverflow и других форумах, но я все еще не могу найти правильный ответ.

В моей базе данных есть 3 таблицы: Users , UserGroups , и Groups .

У Users них есть one-to-many связь с UserGroups и UserGroups
many-to-one с Users .

Связь с Groups и UserGroups такая же, как 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 amp;amp; other.idUsuario != null) || (this.idUsuario != null amp;amp; !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;
    }
}
  

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:
  

Из 21, 2011 10:15:26
org.hibernate.impl.SessionFactoryObjectFactory addInstance
ИНФОРМАЦИЯ: не привязана фабрика к JNDI, имя JNDI не настроено
Из 21, 2011 10:15:33 org.hibernate.util.JDBCExceptionReporter logExceptions ПРЕДУПРЕЖДЕНИЕ: SQL
Ошибка: 1452, SQLState: 23000 Из 21, 2011 10:15:33
org.hibernate.util.JDBCExceptionReporter logExceptions SEVERE: Cannot
add or update a child row: a foreign key constraint fails
(
УТРА социальные . обычаи_группы , CONSTRAINT fk_usuarios FOREIGN KEY
(
id_usuario ) REFERENCES обычаи ( id_usuario ) ON DELETE NO
ACTION ON UPDATE NO ACTION) Out 21, 2011 10:15:33 AM

org.hibernate.event.def.AbstractFlushingEventListener
Выполнение СЕРЬЕЗНЫХ: не удалось синхронизировать состояние базы данных с
сеансом 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: не удается добавить или обновить дочернюю строку:
сбой ограничения внешнего ключа ( social . usuarios_grupos , CONSTRAINT
fk_usuarios ССЫЛКИ НА ВНЕШНИЙ КЛЮЧ ( id_usuario ) usuarios
( id_usuario ) ПРИ УДАЛЕНИИ НИКАКИХ ДЕЙСТВИЙ ПРИ ОБНОВЛЕНИИ НИКАКИХ ДЕЙСТВИЙ)

Комментарии:

1. Мы сталкиваемся с той же проблемой, что и любые решения для этого.

Ответ №1:

Смотрите базовый сгенерированный запрос с помощью show_sql=true ,

Проблема в том, что вы пытаетесь вставить / обновить ссылку, которая не существует.

Комментарии:

1. хорошо, хорошо. Я думаю, что что-то не так с моей моделью пользовательских групп, я вручную вставил данные в таблицу базы данных. Однако, когда я попытался получить список, который будет отображаться в моем представлении, он этого не делает. Возможно, в этом корень проблемы. У вас есть какие-либо идеи, почему это так? даже если сопоставление правильное, и я могу вставлять данные в таблицу usergroup?

2. Основываясь на этом, возможно ли вообще получить список таблицы соединений?