Erro ao deletar entidade com campos not null - Hibernate

2 respostas
cristianopagani

Olá a todos,

Estou com o seguinte problema:
           Possuo uma entidade chamada Usuario, todos os campos desta entidade estão mapeados como not-null:
@Entity
@Table(name = "USUARIO")
public class Usuario implements Serializable {

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	@Id @GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "IDUSUARIO")
	private Integer idusuario;

	@Column(name = "SENHA", nullable = false)
	private String senha;

	@Column(name = "NOME", nullable = false, length = 20, unique = true)
	private String nome;

	@Column(name = "NOMECOMPLETO", nullable = false, length = 60)
	private String nomeCompleto;

	@Column(name = "EMAIL", nullable = false, length = 60)
	private String email;

	@Column(name = "ATIVO", nullable = false)
	private Boolean ativo;

// Contrutores e Getter and Setters........

Estou conseguindo inserir, alterar sem problemas mas quando tento deletar a entidade pelo hibernate acontece o seguinte erro:

not-null property references a null or transient value: com.lpinformatica.sistemaponto.model.schema.administracao.Usuario.ativo; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: com.lpinformatica.sistemaponto.model.schema.administracao.Usuario.ativo

quando executo o método que deleta a entidade eu mando o objeto usuario no parâmetro, esse objeto está apenas com seu id preenchido e os demais campos null. O fato de os demais campos estarem com o valor null faz com que o hibernate não execute a query.
Quando eu configuro os campos para nullable = true tudo funciona. Mas o hibernate não deveria deletar a entidade apenas com seu id definido ?

Agradeço a quem puder esclarecer esta dúvida…

2 Respostas

ignacio83

Vc deve estar montando um objeto na mão (populando só a parte dos ids e mandando deletar)…

Consulte o objeto do banco e passe para o método que deleta, ou execute o delete através de HQL.

O Hibernate está tentando persistir essa entidade que vc criou na mão, só depois ele vai remover…

No hibernate quando uma entidade não está em estado (MANAGED) não é possível remove-lá.

cristianopagani

Realmente o erro era por estar montando o objeto na mão, populando somente o id. Mas agora estou com problemas para construir o HQL. A situação é a seguinte:
Possuo o seguinte relacionamento:

@Entity
@Table(name = "USUARIO")
public class Usuario implements Serializable {

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	@Id @GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "IDUSUARIO")
	private Integer idusuario;

	@Column(name = "SENHA", nullable = false)
	private String senha;

// Relacionamento aqui #################
	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "GRUPOUSUARIO", joinColumns = @JoinColumn(name = "IDUSUARIO"),
			inverseJoinColumns = @JoinColumn(name = "IDGRUPO"))
	private Collection<Grupo> grupos;
//###############################

	@Column(name = "NOME", nullable = false, length = 20, unique = true)
	private String nome;

	@Column(name = "NOMECOMPLETO", nullable = false, length = 60)
	private String nomeCompleto;

	@Column(name = "EMAIL", nullable = false, length = 60)
	private String email;

	@Column(name = "ATIVO", nullable = false)
	private Boolean ativo;

	// Transiente

	@Transient
	private String grupousuario;

//Construtor, Getters, Setters........................
@Entity
@Table(name = "GRUPO")
public class Grupo implements Serializable {

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	@Id @GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "IDGRUPO")
	private Integer idgrupo;

	@Column(name = "NOME", nullable = false, length = 30)
	private String nome;

	@Column(name = "DESCRICAO", nullable = false)
	private String descricao;

	@Column(name = "ATIVO", nullable = false)
	private Boolean ativo;

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "PERMISSAOGRUPOUSUARIO", joinColumns = @JoinColumn(name = "IDGRUPO"),
			inverseJoinColumns = @JoinColumn(name = "IDPERMISSAO"))
	private Collection<Permissao> permissoes;

// Relacionamento aqui #################
	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "GRUPOUSUARIO", joinColumns = @JoinColumn(name = "IDGRUPO"),
			inverseJoinColumns = @JoinColumn(name = "IDUSUARIO"))
	private Collection<Usuario> usuarios;
//###############################

//Construtor, Getters, Setters...............................

Perceba que eu possuo um relacionamento de muitos pra muitos entre Usuário e Grupo, porém não existe a “Classe GrupoUsuário” mas existe a tabela grupousuario no banco, pois foi gerada apartir do mapeamento.
Como faria o HQL que deletasse um determinado usuário e todos os seus grupos relacionados?

Mais uma vez obrigado.

Criado 19 de fevereiro de 2009
Ultima resposta 20 de fev. de 2009
Respostas 2
Participantes 2