【问题标题】:How to delete a child record when there ManyToOne relationship?存在多对一关系时如何删除子记录?
【发布时间】:2013-12-21 23:23:33
【问题描述】:

表 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;ç

桌子上的乌苏里奥

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

这是我拥有的代码,但我没有删除记录。我尝试对具有关系的表使用相同的代码,如果它有效,我应该做更多的工作来删除子记录吗?

【问题讨论】:

  • 尝试删除此实例时是否收到警告或异常?没试过,不过一般实体需要先加载再删除。
  • 不显示 exepcion ,相反的结果是 true 并显示消息 Record Deleted succesfull。但记录存在。
  • 假设 cod 是您的 PK 时,用 session.delete(session.get(Usuario.class, usuario.getIdUsuario())) 替换删除会发生什么?
  • 谢谢,是的,PK 是 cod 并将 Session.delete(usuario) 替换为 session.delete (session.get (Usuario.class, usuario.getIdUsuario ())) 并运行

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


【解决方案1】:

正如 cmets 中所讨论的:实体需要位于持久性上下文中,Hibernate 才能正确删除它。所以解决办法是先用Hibernate来获取。

替换

session.delete(usuario);

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

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

【讨论】:

    【解决方案2】:

    您可以使用 SQL 更新注册并稍后删除。

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 2014-08-22
      • 2022-01-28
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多