Problema com Mapeamento de Herança

Boa noite, fiz um mapeamento com 3 classes da seguinte maneira:

@Entity
@Table(name="USUARIO")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TP_USUARIO", length = 1, discriminatorType = DiscriminatorType.STRING)
public abstract class Usuario implements Serializable {}

@Entity
@DiscriminatorValue(value="U")
public class Aluno extends Usuario implements Serializable {}

@Entity
@DiscriminatorValue(value = "A")
public class Administrador extends Usuario implements Serializable {}

Para o aluno está funcionando, porém quando tento carregar um administrador ele mostra esse erro:

GRAVE: org.hibernate.WrongClassException: Object with id: 100 was not of the specified subclass: br.unisul.prolinear.model.Usuario (Discriminator: A)

O que está errado?

Caused by: org.hibernate.WrongClassException: Object with id: 100 was not of the specified subclass: br.unisul.prolinear.model.Usuario (Discriminator: A)

ja tentou usar a anotação @ForceDiscriminator na classe Pai?

obs: a solução é específica do hibernate, não sei se funciona em outras implementações

Tentei agora e continuou do mesmo jeito.

De acordo com a explicação você precisa setar um DiscriminatorValue na classe genérica também :slight_smile:

Agora o problema ficou diferente…
Eu uso um DAO Genérico e recupero o usuário logado da seguinte maneira:

Authentication authentication = (Authentication) SecurityContextHolder.getContext().getAuthentication(); 
if(authentication != null){
     String email = authentication.getName();
     UsuarioDaoImp dao = new UsuarioDaoImp();
     Usuario usuario = dao.get("email", email);
 }

Quando eu seto o discriminador para aluno ele funciona normal, mas quando seto para administrador o dao retorna null.[youtube]

alguém já passou por algo semelhante?

Existe um administrador com esse email aí?

existe, eu faço o teste setando o campo na mão, quando seto para aluno ele recupera normalmente, quando seto para administrador ele retorna null;

O código desse método no dao é esse:

public T get(String campo, Object valor) {
		try{
			List<T> lista =  HibernateUtil.getSession().createCriteria(oClass).add(Restrictions.eq(campo, valor)).list();
			if(lista.isEmpty()){  
				return null;
			} else{
				return (T) lista.get(0);
			}
		}finally{
			HibernateUtil.closeSession();
		}
	}

No caso ele retorna a lista vazia.

Editado…