![](/img/trans.png)
[英]java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
[英]java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails ERROR
我已经在这个问题上待了两个星期了,在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 && 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>
@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_usuariosFOREIGN 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
)参考usuarios
(id_usuario
)ON DELETE NO ACTION ON UPDATE NO ACTION)
通过show_sql=true
查看基础生成的查询,
问题是您尝试插入/更新不存在的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.