使用Hibernate删除表格不起作用

时间:2014-06-06 01:38:27

标签: java spring hibernate spring-mvc

在我的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&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>

方法从控制器删除()

@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);
    }
}

1 个答案:

答案 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的关系。保留数据库中的用户和权限。