Reputation: 9065
In my spring project, Hibernate is used to manage the access to the database. For this, I have the tradicional schema using Entity and Dao classes, which are used by my service classes. am facing problems when I need remove a row from some table in my database. For instance, follow the code below:
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>
method remove() from controller
@RequestMapping(value="remove", method=RequestMethod.POST)
@ResponseBody
public String remove(HttpServletRequest request, HttpServletResponse response) {
if(permissao.remove(request, response))
return "yes";
else
return "not";
}
method remove() from service class
@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);
}
In the first method, altera(...), the second block of code from if...else should remove a permission fromthe user. The second method remove a role created by the user (roles in my project are a set of permissions).
The problem in first method is that when I try remove a row, a new one is inserted instead. In the second method, I am not able to remove the element because the system return an error of violation foreign key.
Anyone can help with some information of jow I should modify this method to accomplish the desired function?
ps.: my entity class related to the example above is:
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;
}
}
UPDATE 2
My final code is this:
@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);
}
}
Upvotes: 0
Views: 143
Reputation: 8414
Essentially you need to call session.getCurrentSession().delete(entity); to remove the entity using hibernate.
Or you can create a cutomer query using createQuery.
This is a great example of how to remove an object from table using hibernate:
http://examples.javacodegeeks.com/enterprise-java/hibernate/delete-persistent-object-with-hibernate/
EDIT 1: Based on extra information provided where you want to remove permission relationship from user then code you need to insert into either controller or pojo can be following:
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.
This will remove the relationship to the permissao from the user. Keeps the user and permission in database.
Upvotes: 1