Entidade auto referenciada no hibernate

Boa noite, gostaria de saber como funciona as entidades de auto referenciamento do hibernate. Estou lendo um livro e nele está dizendo que agora vai ser feito uma arvore com primefaces, e para definir as categorias pais e filhas dessa árvore será utilizado uma entidade auto relacionada no hibernate, e estou com muita duvida, a classe é a seguinte:

Tendo o seguinte código na entidade categoria:

@Entity
public class Categoria implements Serializable {

	@Id
	@GeneratedValue
	private Integer codigo;

	@ManyToOne
	@JoinColumn(name = "categoria_pai", nullable = true)
	@org.hibernate.annotations.ForeignKey(name = "fk_categoria_categoria")
	private Categoria	pai;

	@ManyToOne
	@OnDelete(action=OnDeleteAction.CASCADE)
	@JoinColumn(name = "usuario")
	@org.hibernate.annotations.ForeignKey(name = "fk_categoria_usuario")
	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 = "descricao 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 String getDescricao() {
		return descricao;
	}

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

	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 List<Categoria> getFilhos() {
		return filhos;
	}

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

	public int getFator() {
		return fator;
	}

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

Alguem pode me explicar como é que se da a forma de construção de uma foreign key pelo hibernate e como utiliza-la na mesma classe, também o porque daquela foreign key na propriedade usuario.

Mapeia a su entidade como essa e tudo funcionara…

@Entity
@Table(name = "funcionalidade")
public class Funcionalidade implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @Id
    @Column(name = "id_funcionalidade")
    private Integer idFuncionalidade;
    
    @Column(name = "cd_funcionalidade")
    private String cdFuncionalidade;
    
    @Column(name = "nm_funcionalidade")
    private String nmFuncionalidade;
    
    @Column(name = "ds_funcionalidade")
    private String dsFuncionalidade;
    
    @Column(name = "tp_identificador")
    private String tpIdentificador;

    @Column(name = "id_funcionalidadepai")
    private Integer idFuncionalidadePai;
    
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_funcionalidadepai", referencedColumnName = "id_funcionalidade", insertable = false, updatable = false)
    private Funcionalidade funcionalidadePai;
    
    @OneToMany(mappedBy = "funcionalidadePai", fetch = FetchType.LAZY)
    private List&lt;Funcionalidade&gt; listFuncionalidadeFilha;
    
    @OneToMany(mappedBy = "funcionalidade", fetch = FetchType.LAZY)
    private List&lt;LicFuncVinc&gt; listLicFuncVinc;

Velho está fucionando o que eu postei é um exemplo do livro, mas eu não consegui entender com a explicação do livro, gostaria que alguem me explicasse, se possivel.