E aí pessoal, seguinte, estou com um problema no hibernate que é o seguinte tenho uma estrutura bem complexa de pais e filhos e todos com chave composta. Os mapeamentos entre pais e filhos são todos bidirecionais. Aparentemente, quando pego a primeira coleção de filhos tudo corre bem, entretanto, quando busco a coleção de filhos que pertence a um dos filhos trazidos na primeira coleção o hibernate parece não carregar a coleção e causa um null pointer exception. (é importante frisar que existe a terceira coleção de filhos, se fizer um debug dentro do hibernate ele chega a buscar os filhos, mas parece não conseguir substituir o proxy).
Abaixo estou enviando os mapeamentos e as classes:
<hibernate-mapping>
<class name="com.industrial.engenharia.fichatecnica.servidor.FichaTecnica" table="fichas_tecnicas">
<id name="idFichaTecnica" type="java.lang.Integer" column="ID_FICHA_TECNICA">
<generator class="increment"/>
</id>
<set name="ftFases" inverse="true" cascade="all-delete-orphan">
<key column="ID_FICHA_TECNICA"/>
<one-to-many class="com.industrial.engenharia.fichatecnica.servidor.FtFase"/>
</set>
</class>
</hibernate-mapping>
public class FichaTecnica implements Serializable {
private Integer idFichaTecnica;
private Set ftFases;
public Integer getIdFichaTecnica() {
return idFichaTecnica;
}
public void setIdFichaTecnica(Integer integer) {
idFichaTecnica = integer;
}
public Set getFtFases() {
return ftFases;
}
public void setFtFases(Set set) {
ftFases = set;
}
public void addFtFase(FtFase ftFase) {
ftFase.setFichaTecnica(this);
if (getFtFases() == null) {
setFtFases(new HashSet());
}
getFtFases().add(ftFase);
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!super.equals(o)) {
return false;
}
if (o == null) {
return false;
}
if (o.getClass() != getClass()) {
return false;
}
FichaTecnica castedObj = (FichaTecnica) o;
return (
(this.idFichaTecnica == null ? castedObj.idFichaTecnica == null : this.idFichaTecnica.equals(castedObj.idFichaTecnica)));
}
public int hashCode() {
int hashCode = super.hashCode();
hashCode = 31 * hashCode + (idFichaTecnica == null ? 0 : idFichaTecnica.hashCode());
return hashCode;
}
}
<hibernate-mapping>
<class name="com.industrial.engenharia.fichatecnica.servidor.FtFase" table="FT_FASES">
<composite-id unsaved-value="any">
<key-property name="idFtFase" column="ID_FT_FASE"/>
<key-property name="idFichaTecnica" column="ID_FICHA_TECNICA"/>
</composite-id>
<set name="ftProcedencias" lazy="true" inverse="true" cascade="all-delete-orphan">
<key>
<column name="ID_FT_FASE"/>
<column name="ID_FICHA_TECNICA"/>
</key>
<one-to-many class="com.industrial.engenharia.fichatecnica.servidor.FtProcedencia"/>
</set>
<many-to-one name="fichaTecnica" class="com.industrial.engenharia.fichatecnica.servidor.FichaTecnica" column="ID_FICHA_TECNICA" insert="false" update="false"/>
</class>
</hibernate-mapping>
public class FtFase extends Persistent implements Serializable {
private Integer idFichaTecnica;
private Integer idFtFase;
private FichaTecnica fichaTecnica;
private Set ftProcedencias;
public FichaTecnica getFichaTecnica() {
return fichaTecnica;
}
public Set getFtProcedencias() {
return ftProcedencias;
}
public Integer getIdFichaTecnica() {
return idFichaTecnica;
}
public Integer getIdFtFase() {
return idFtFase;
}
public void setFichaTecnica(FichaTecnica tecnica) {
setIdFichaTecnica(tecnica.getIdFichaTecnica());
fichaTecnica = tecnica;
}
public void setFtProcedencias(Set set) {
ftProcedencias = set;
}
public void setIdFichaTecnica(Integer integer) {
idFichaTecnica = integer;
}
public void setIdFtFase(Integer integer) {
idFtFase = integer;
}
public void addFtProcedencia(FtProcedencia ftProcedencia) {
ftProcedencia.setFtFase(this);
if (getFtProcedencias() == null) {
setFtProcedencias(new HashSet());
}
getFtProcedencias().add(ftProcedencia);
}
public int hashCode() {
int hashCode = super.hashCode();
hashCode = 31 * hashCode + (idFichaTecnica == null ? 0 : idFichaTecnica.hashCode());
hashCode = 31 * hashCode + (idFtFase == null ? 0 : idFtFase.hashCode());
hashCode = 31 * hashCode + (fichaTecnica == null ? 0 : fichaTecnica.hashCode());
return hashCode;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!super.equals(o)) {
return false;
}
if (o == null) {
return false;
}
if (o.getClass() != getClass()) {
return false;
}
FtFase castedObj = (FtFase) o;
return (
(this.idFichaTecnica == null ? castedObj.idFichaTecnica == null : this.idFichaTecnica.equals(castedObj.idFichaTecnica))
&& (this.idFtFase == null ? castedObj.idFtFase == null : this.idFtFase.equals(castedObj.idFtFase)));
}
}
<hibernate-mapping>
<class name="com.industrial.engenharia.fichatecnica.servidor.FtProcedencia" table="FT_PROCEDENCIAS">
<composite-id unsaved-value="any">
<key-property name="idFtProcedencia" column="ID_FT_PROCEDENCIA"/>
<key-property name="idFtFase" column="ID_FT_FASE"/>
<key-property name="idFichaTecnica" column="ID_FICHA_TECNICA"/>
</composite-id>
<many-to-one name="ftFase" class="com.industrial.engenharia.fichatecnica.servidor.FtFase" update="false" insert="false" >
<column name="ID_FT_FASE"/>
<column name="ID_FICHA_TECNICA"/>
</many-to-one>
</class>
</hibernate-mapping>
public class FtProcedencia extends Persistent implements Serializable {
private Integer idFichaTecnica;
private Integer idFtFase;
private Integer idFtProcedencia;
private FtFase ftFase;
public FtFase getFtFase() {
return ftFase;
}
public Integer getIdFichaTecnica() {
return idFichaTecnica;
}
public Integer getIdFtFase() {
return idFtFase;
}
public Integer getIdFtProcedencia() {
return idFtProcedencia;
}
public void setFtFase(FtFase fase) {
setIdFichaTecnica(fase.getIdFichaTecnica());
setIdFtFase(fase.getIdFtFase());
ftFase = fase;
}
public void setIdFichaTecnica(Integer integer) {
idFichaTecnica = integer;
}
public void setIdFtFase(Integer integer) {
idFtFase = integer;
}
public void setIdFtProcedencia(Integer integer) {
idFtProcedencia = integer;
}
public void addFtTonalidade(FtTonalidade ftTonalidade) {
ftTonalidade.setFtProcedencia(this);
if (getFtTonalidades() == null) {
setFtTonalidades(new HashSet());
}
getFtTonalidades().add(ftTonalidade);
}
public int hashCode() {
int hashCode = super.hashCode();
hashCode = 31 * hashCode + (idFichaTecnica == null ? 0 : idFichaTecnica.hashCode());
hashCode = 31 * hashCode + (idFtFase == null ? 0 : idFtFase.hashCode());
hashCode = 31 * hashCode + (idFtProcedencia == null ? 0 : idFtProcedencia.hashCode());
return hashCode;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!super.equals(o)) {
return false;
}
if (o == null) {
return false;
}
if (o.getClass() != getClass()) {
return false;
}
FtProcedencia castedObj = (FtProcedencia) o;
return (
(this.idFichaTecnica == null ? castedObj.idFichaTecnica == null : this.idFichaTecnica.equals(castedObj.idFichaTecnica))
&& (this.idFtFase == null ? castedObj.idFtFase == null : this.idFtFase.equals(castedObj.idFtFase))
&& (this.idFtProcedencia == null ? castedObj.idFtProcedencia == null : this.idFtProcedencia.equals(castedObj.idFtProcedencia)));
}
}
Desculpe a quantidade de código, mas como pode ser um problema nas próprias classes tive que postá-las de uma maneira que fosse inteligível. Retirei vários campos dos mapeamentos e das classes e deixei apenas onde aparentemente podia se encontrar o problema. Também retirei o resto da estrutura, pois apartir dai todas as ftProcedencias possuem uma coleção de tonalidades e por ai vai.
Outra coisa, se eu tirar o lazy=“true” dos sets parece-me que o hibernate entrra em loop e fica buscando em ft_fases e ft_procedencias em sequência e preciso matar o processo.
Hmmm, as chaves não mapeiam o objeto pelo fato da estrutura ser muito grande e isso acabaria fazendo com q para fazer load de um objeto na estrutra eu teria que criar muitas keys.
Vallew