我在Hibernate中遇到了问题。
我有2个班级:
@Entity
@Table(name="grupos")
public class Group implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String nombreGrupo;
@ManyToMany
@JoinTable(name="grupos_usuarios",joinColumns=@JoinColumn(name="grupo_id"),inverseJoinColumns=@JoinColumn(name="usuario_id"))
private Set<Usuario> usuarios = new HashSet<Usuario>();
和另一个班..
@Entity
@Table(name="usuarios")
public class User implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String nombreUsuario;
@ManyToMany(fetch = FetchType.LAZY ,mappedBy="usuarios")
private Set<Grupo> grupos = new HashSet<Grupo>();
所以我使用连接表。一个组可以有多个用户,一个用户可以有多个组。问题是当我尝试删除一个组时
ERROR: Cannot delete or update a parent row: a foreign key constraint fails (`pfc`.`grupos_usuarios`, CONSTRAINT `FK_2pjiv067qnbhmbgjt35vogy93` FOREIGN KEY (`grupo_id`) REFERENCES `grupos` (`id`))
例如,如果我删除一个组,我不必删除用户(这就是我不使用cascade.remove的原因)。在这种情况下,如果我删除一个组,则连接表中有行null colums。我想这是错误的原因。是否可以删除这些行? 感谢
答案 0 :(得分:1)
错误原因在异常消息中解释:
外键约束失败(
pfc
。grupos_usuarios
,CONSTRAINTFK_2pjiv067qnbhmbgjt35vogy93
FOREIGN KEY(grupo_id
)参考grupos
(id
))
您尝试删除用户所属的群组。所以要么你决定这不可能(错误是好事),要么你决定首先从组中删除用户,你必须在删除组之前明确地做到这一点:
group.getUsuarios().clear(); // removes all the users of this group
session.delete(group);
编辑:
要删除用户,您还需要删除该关联。由于group.usuarios
是关联的所有者方,因此必须修改这一方。清除User.grupos
是不够的:
for (Group group : user.getGrupos()) {
group.getUsuarios().remove(user); // removes all the associations between the user and its groups
}
user.getGrupos().clear();
session.delete(user);
答案 1 :(得分:0)
听起来不错。但我得到了同样的错误。 也许我会尝试创建两个@ many关系,而不是许多@ many关系。或者我可以使用xml而不是注释(xml很多@ many工作得更好?)我可以在互联网上阅读一些有相同问题的人