在我的spring项目中,Hibernate用于管理对数据库的访问。为此,我使用了Entity和Dao类的tradicional模式,我的服务类使用它们。我需要从数据库中的某个表中删除一行时遇到问题。例如,请遵循以下代码:
remove.jsp
<c:url value="/usuario/listagem" var="listagem"/>
<c:url value="/permissao/remove" var="removePermissao"/>
<form class="form" role="form" action="${removePermissao}" method="post">
<div class="alert alert-warning" id="pergunta">
Tem certeza que quer excluir o grupo de permissões <strong><c:out value="${permissao.nome}"/></strong>?
<input type="hidden" name="id" value="<c:out value="${permissao.id}"/>">
<button type="submit" class="btn btn-lg btn-link"><span class="glyphicon glyphicon-ok"></span></button>
<button type="button" class="btn btn-lg btn-link link" data-action="${listagem}"><span class="glyphicon glyphicon-remove"></span></button>
</div>
</form>
<div id="yes" class="alert alert-success" style="display: none;">
<strong>Pronto!</strong> Permissão excluida com sucesso.
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
</div>
<div id="not" class="alert alert-danger" style="display: none;">
<strong>Erro!</strong> Não foi possivel excluir a permissão.
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
</div>
方法从控制器删除()
@RequestMapping(value="remove", method=RequestMethod.POST)
@ResponseBody
public String remove(HttpServletRequest request, HttpServletResponse response) {
if(permissao.remove(request, response))
return "yes";
else
return "not";
}
方法从服务类中删除()
@PreAuthorize("hasPermission(#user, 'altera_permissao')")
@Transactional
public boolean altera(HttpServletRequest request, HttpServletResponse response) {
String id_usuario = request.getParameter("usuario");
String id_permissao = request.getParameter("grupo");
String possui = request.getParameter("possui");
if(possui.equals("yes")) {
Usuario user = usuario.findById(Integer.valueOf(id_usuario).intValue());
user.getAutorizacao().add(grupo_permissao.findById(Integer.valueOf(id_permissao).intValue()));
return usuario.merge(user);
}
else {
Usuario user = usuario.findById(Integer.valueOf(id_usuario).intValue());
int max = user.getAutorizacao().size();
for(int i=0; i<max; i++) {
if(user.getAutorizacao().get(i).equals(grupo_permissao.findById(Integer.valueOf(id_permissao).intValue()))) {
user.getAutorizacao().set(i, null);
}
}
return usuario.merge(user);
}
}
@PreAuthorize("hasPermission(#user, 'remove_permissao')")
@Transactional
public boolean remove(HttpServletRequest request, HttpServletResponse response) {
String id = request.getParameter("id");
GrupoPermissao novo = grupo_permissao.findById(Integer.valueOf(id).intValue());
novo.setPermissao(null);
return grupo_permissao.remove(novo);
}
在第一种方法altera(...)中,if ... else的第二个代码块应该删除用户的权限。第二种方法是删除用户创建的角色(我项目中的角色是一组权限)。
第一种方法的问题是,当我尝试删除一行时,会插入一个新行。在第二种方法中,我无法删除该元素,因为系统返回了违规外键的错误。
任何人都可以提供一些有关jow的信息我应该修改这个方法来完成所需的功能吗?
ps。:与上述示例相关的实体类是:
Permissao.java
@Entity
@Table(name="permission")
public class Permissao {
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
@Column(name="nome")
private String nome;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
GrupoPermissao.java
@Entity
@Table(name="role")
public class GrupoPermissao {
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
@Column(name="nome")
private String nome;
@ManyToMany
@JoinTable(name="role_permissions", joinColumns={@JoinColumn(name="fk_role")}, inverseJoinColumns={@JoinColumn(name="fk_permission")})
@LazyCollection(LazyCollectionOption.FALSE)
private List<Permissao> permissao = new ArrayList<Permissao>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public List<Permissao> getPermissao() {
return permissao;
}
public void setPermissao(List<Permissao> permissao) {
this.permissao = permissao;
}
}
更新2
我的最终代码是:
@PreAuthorize("hasPermission(#user, 'altera_permissao')")
@Transactional
public boolean altera(HttpServletRequest request, HttpServletResponse response) {
String id_usuario = request.getParameter("usuario");
String id_permissao = request.getParameter("grupo");
String possui = request.getParameter("possui");
if(possui.equals("not")) {
Usuario user = usuario.findById(Integer.valueOf(id_usuario).intValue());
user.getAutorizacao().add(grupo_permissao.findById(Integer.valueOf(id_permissao).intValue()));
return usuario.merge(user);
}
else {
Usuario user = usuario.findById(Integer.valueOf(id_usuario).intValue());
int max = user.getAutorizacao().size();
int index[] = new int[max];
for(int i=0; i<max; i++)
index[i] = -1;
for(int i=0; i<max; i++) {
String p_user = user.getAutorizacao().get(i).getNome();
String p_comp = grupo_permissao.findById(Integer.valueOf(id_permissao).intValue()).getNome();
System.out.println(i+"->"+p_user+"=="+p_comp);
if(p_user.equals(p_comp)) {
index[i] = i;
}
}
for(int i=0; i<max; i++)
if(index[i] >= 0)
user.getAutorizacao().remove(i);
return usuario.merge(user);
}
}
答案 0 :(得分:1)
基本上你需要调用session.getCurrentSession()。delete(entity);使用hibernate删除实体。
或者您可以使用createQuery创建一个cutomer查询。
这是如何使用hibernate从表中删除对象的一个很好的例子:
http://examples.javacodegeeks.com/enterprise-java/hibernate/delete-persistent-object-with-hibernate/
编辑1: 根据您要从用户中删除权限关系的额外信息 然后您需要插入控制器或pojo的代码可以遵循:
User user = // allocate your user;
Permissao permissao = // allocate the permission you wish to remove
user.setPermissao(user.getPermissao().remove(permissaio);
then save the user object through saveOrUpdate() or Update() function.
这将删除与用户的permissao的关系。保留数据库中的用户和权限。