Problema com herança (hibernate)

1 resposta
R

Pessoal,

Primeiramente peço desculpas se já tem tópico semelhante, não consegui encontrar na busca.

Estou com um problema que já algumas horas tento resolver e não consigo. No projeto uso hibernate 3.

A situação é a seguinte:
Tenho uma hierarquia de classes mapeada via SINGLE_TABLE da JPA:

@Entity
@Table(name = "ELEMENTO_DOC")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TIPO_ELEMENTO", discriminatorType = DiscriminatorType.STRING)
public abstract class ElementoDoc {
	@Column(name = "ID")
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	protected Integer id;
        ...
}

@Entity
@DiscriminatorValue("PARAGRAFO")
public class Paragrafo extends ElementoDoc implements Serializable {
	@Column(name = "TEXTO", length = 2000)
	private String texto;
        ...
}

@Entity
@DiscriminatorValue("SECAO")
public class Secao extends ElementoDoc implements Serializable {	
	@Column(name = "TITULO")
	private String titulo;
        ...
}
<existem outras estendendo ElementoDoc, mas acredito que estas sejam suficientes>

E uma classe principal com uma relação muitos para um com ElementoDoc:

@Table(name = "DOC")
@Entity
public class Doc implements Serializable, Comparable<Doc> {
	@Column(name = "ID")
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private Integer id;

	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
	@JoinColumn(name = "ID_DOC", nullable = true)
	private Set<ElementoDoc> elementos = new HashSet<ElementoDoc>();

      ...
}

Eis meu problema:

Quando eu utilizo o resultado de uma query no banco dentro de um stateless, os valores da classe mãe, ElementoDoc, são retornados normalmente. Porém, quando sai do stateless, estes mesmos métodos retornam null.

Já os valores da classe filha sempre vem corretamente.

Por exemplo:

// trecho dentro do stateless
	@TransactionAttribute(TransactionAttributeType.SUPPORTS)
	public Doc getDocById(Integer id) throws DocException {
		List<Doc> docs = em.createNamedQuery("docById").setParameter("id", id).getResultList();
		if (docs.isEmpty()) {
			throw new DocException("Documento não encontrado!");
		}
		for (ElementoDoc e : docs.get(0).getElementos()) { // teste
			logger.info(e.getId());
		}
		return docs.get(0);
	}

Este trecho de código acima imprime os ids corretamente.

// trecho chamando o método do stateless
       public Doc getDocById(Integer id) throws DocException {
		Doc doc = docManager.getDocById(id);
		for (ElementoDoc e : doc.getElementos()) {
			logger.info(e.getId());
		}
		return doc;
	}

Já este trecho imprime null

Alguém já passou por problema parecido?
Não tenho muita experiência com EJB, posso estar deixando algo passar despercebido.

Obrigado!

1 Resposta

R

Problema resolvido!

A quem interessar no futuro:
Foi preciso implementar Serializable na superclasse (ElementoDoc).

Abraços

Criado 4 de outubro de 2011
Ultima resposta 4 de out. de 2011
Respostas 1
Participantes 1