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.