当有ManyToOne关系时如何删除子记录?

时间:2013-12-05 06:20:25

标签: java hibernate netbeans-7 many-to-one cascading-deletes

表grpUsuario

        @Id
        @Basic(optional = false)
        @NotNull
        @Column(name = "grupo")
        private Integer grupo;

        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 64)
        @Column(name = "descripcion")
        private String descripcion;

        @OneToMany(cascade = CascadeType.ALL, mappedBy = "secLevel")
        private Collection<Menu> menuCollection;

        @OneToMany(cascade = CascadeType.ALL, mappedBy = "grupo", orphanRemoval = true)
        private Collection<Usuario> usuarioCollection;ç

表Usuario

    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 64)
    @Column(name = "IdUsuario")
    private String idUsuario;

    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 64)
    @Column(name = "password")
    private String password;

    @Size(max = 16)
    @Column(name = "nombres")
    private String nombres;

    @Size(max = 24)
    @Column(name = "apellidos")
    private String apellidos;

    // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Correo electrónico no válido")//if the field contains email address consider using this annotation to enforce field validation
    @Size(max = 64)
    @Column(name = "email")
    private String email;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idUsuario")
    private Collection<Encuesta> encuestaCollection;

    @JoinColumn(name = "grupo", referencedColumnName = "grupo" )
    @ManyToOne(optional = false)
    private Grpusuario grupo;

控制器

String cod = request.getParameter("cod");
Usuario usuario= new Usuario(cod);
boolean resultado = usuario_servicio.delete(usuario);

删除功能

 public boolean delete(Usuario usuario){
        Session session = HibernateUtil.openSession();  
        Transaction tx = null;        
        try {
            tx = session.getTransaction();
            tx.begin();
            session.delete(usuario);
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }        
        return true;
    }

这是我的代码,但我没有删除记录。这个相同的代码我尝试过有关系的表,如果有效,我应该做些什么来帮我删除子记录?

2 个答案:

答案 0 :(得分:0)

您可以使用SQL更新注册表和以后删除。

答案 1 :(得分:0)

正如评论中所讨论的:实体需要在Hibernate的持久化上下文中才能正确删除它。所以解决方案是首先使用Hibernate获取它。

替换

session.delete(usuario);

session.delete(session.get(Usuario.class, usuario.getIdUsuario()));

注意:如果实体不在数据库中,get()可以返回null值,因此在将对象传递给delete之前,最好先检查一下。