Kleber Mota
Kleber Mota

Reputation: 9065

Deletion of table using Hibernate don't work

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&otilde;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&atilde;o excluida com sucesso.
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
      </div>

      <div id="not" class="alert alert-danger" style="display: none;">
        <strong>Erro!</strong> N&atilde;o foi possivel excluir a permiss&atilde;o.
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</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

Answers (1)

Aeseir
Aeseir

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

Related Questions