Erro de gravação com o Hibernate

Boa noite a todos,

Estou estudando um livro sobre java, o livro aborda assuntos como hibernate, maven entre outros. Na parte que estou com problema, estou salvando uma lista de categoria (de forma recursiva) e que o primeiro item da lista possui alguns atributos nulos (trata-se do pai da hierarquia), segue abaixo a classe bean que faz a gravação:

Método que salva o bean.
Categoria despesas = new Categoria(null, usuario, “DESPESAS”, -1);
this.categoriaDAO.salvar(new Categoria(despesas, usuario, “Moradia”, -1));
despesas = this.categoriaDAO.salvar(despesas);

Parte do código da classe categoria

@Entity
public class Categoria implements Serializable {
@Id
@GeneratedValue
private Integer codigo;

@ManyToOne
@JoinColumn(name = "categoria_pai", nullable = true, foreignKey = @ForeignKey(name = "fk_categoria_categoria"))
private Categoria pai;

// construtor

public Categoria(Categoria pai, Usuario usuario, String descricao, int fator) {
	this.pai = pai;
	this.usuario = usuario;
	this.descricao = descricao;
	this.fator = fator;
}

… continua

o erro que aparece.

javax.servlet.ServletException: javax.servlet.ServletException: java.lang.NullPointerException
ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:43)

Obrigado a todos, não sei se consegui expressar corretamente o problema.

Seu erro está nesta linha!
Nullpointer, algo lá n está instanciado.

Bom dia Rodrigo,
Então, você tem razão, a primeira categoria que é salva, ela é gravada como nula (no livro descreve desta maneira), pois como se trata de uma tabela que faz referência a outra (da mesma tabela), a primeira categoria (categoria pai) não deve possui nenhuma categoria associada a ela, ela deve ser uma categoria nula.

Categoria despesas = new Categoria(null, usuario, “DESPESAS”, -1);
this.categoriaDAO.salvar(new Categoria(despesas, usuario, “Moradia”, -1));

Posta a classe completa

Boa noite, segue a classe para sua análise:

@Entity
public class Categoria implements Serializable {
/**
*
*/
private static final long serialVersionUID = -976344612708369070L;
@Id
@GeneratedValue
private Integer codigo;
@ManyToOne
@JoinColumn(name = “categoria_pai”, nullable = true, foreignKey = @ForeignKey(name = “fk_categoria_categoria”))
private Categoria pai;

@ManyToOne
@JoinColumn(name = "usuario", foreignKey = @ForeignKey(name = "fk_categoria_usuario"))
@OnDelete(action = OnDeleteAction.CASCADE)
private Usuario usuario;

private String descricao;
private int fator;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
@JoinColumn(name = "categoria_pai", updatable = false)
@org.hibernate.annotations.OrderBy(clause = "descrica asc")
private List<Categoria> filhos;

public Categoria() {
}

public Categoria(Categoria pai, Usuario usuario, String descricao, int fator) {
	this.pai = pai;
	this.usuario = usuario;
	this.descricao = descricao;
	this.fator = fator;
}

public Integer getCodigo() {
	return codigo;
}

public void setCodigo(Integer codigo) {
	this.codigo = codigo;
}

public Categoria getPai() {
	return pai;
}

public void setPai(Categoria pai) {
	this.pai = pai;
}

public Usuario getUsuario() {
	return usuario;
}

public void setUsuario(Usuario usuario) {
	this.usuario = usuario;
}

public String getDescricao() {
	return descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public int getFator() {
	return fator;
}

public void setFator(int fator) {
	this.fator = fator;
}

public List<Categoria> getFilhos() {
	return filhos;
}

public void setFilhos(List<Categoria> filhos) {
	this.filhos = filhos;
}

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
	return result;
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Categoria other = (Categoria) obj;
	if (codigo == null) {
		if (other.codigo != null)
			return false;
	} else if (!codigo.equals(other.codigo))
		return false;
	return true;
}

}