Hibernate如何在连接表中删除带有空列的行

时间:2014-03-16 22:31:28

标签: java mysql hibernate

我在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。我想这是错误的原因。是否可以删除这些行? 感谢

2 个答案:

答案 0 :(得分:1)

错误原因在异常消息中解释:

  

外键约束失败(pfcgrupos_usuarios,CONSTRAINT FK_2pjiv067qnbhmbgjt35vogy93 FOREIGN KEY(grupo_id)参考gruposid))

您尝试删除用户所属的群组。所以要么你决定这不可能(错误是好事),要么你决定首先从组中删除用户,你必须在删除组之前明确地做到这一点:

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工作得更好?)我可以在互联网上阅读一些有相同问题的人