Herança + OneToOne = Erro na query!

Prezados Srs.

Possuo as classes Insumo e Ins_Material, conforme abaixo;
@Entity
@Table(name = "insumo")
@Inheritance (strategy=InheritanceType.JOINED)
@DiscriminatorColumn (name="tipo",discriminatorType=DiscriminatorType.CHAR, length=1)
@DiscriminatorValue (value="M")
@NamedQueries({@NamedQuery(name="insumo_cadastrados",  query="SELECT ins FROM Insumo ins WHERE ins.situacao = :insumo_situacao")})

public class Insumo implements Serializable{

... omissão dos atributos e métodos...

@OneToOne(cascade = CascadeType.ALL, mappedBy = "insumo")
private Ins_Material insMaterial;
@Entity
@Table(name = "ins_material")
@DiscriminatorValue (value="M")

public class Ins_Material extends Insumo implements Serializable{

...omissão dos atributos e métodos...

@OneToOne
@JoinColumn(name = "codigo", nullable = false, unique = true, updatable = false)
private Insumo insumo;

Os procedimentos de persistência estão OK, o problema esta em quando tento recuperar os dados via NamedQueries (executando a insumo_cadastrados da classe Insumo) recebo a seguinte mensagem de erro:

Exception Description: Trying to set value [model.gerais.Insumo@20] for instance variable [insMaterial] of type [model.gerais.Ins_Material] in the object. The specified object is not an instance of the class or interface declaring the underlying field, or an unwrapping conversion has failed.
Internal Exception: java.lang.IllegalArgumentException: Can not set model.gerais.Ins_Material field model.gerais.Insumo.insMaterial to model.gerais.Insumo
Mapping: oracle.toplink.essentials.mappings.OneToOneMapping[insMaterial]
Descriptor: RelationalDescriptor(model.gerais.Insumo --> [DatabaseTable(insumo)])

E se executo novamente a NamedQuery após a mensagem de erro, os registros são trazidos em memória sem a mensagem de erro.

Atenciosamente,

Olavo Jr.

Estranho, como se ele nao tivesse no primeiro momento da execução o metodo set para objeto relacionado, ou em algum momento ele nao estah conseguindo obter o valor do id do objeto e logo nao consegue fazer o instance of da classe relacionada. Voce sobrescreveu os metodo equals e hashCode na suas classes javabeans(provavel causa do problema, jah q no segundo momento ele consegue executar a hql)?

Olá ebarros,

Obrigado por responder, possuo o método equals e hashcode apenas na classe pai. Estava com o mapeamento OneToOne bidirecional, então depois de análise alterei para unidirecional.
Depois de tanto debugar o código cheguei ao problema e você estava com a razão, o método getCodigo dos filhos estavam retornando null, por isso a mensagem de erro. Alterei o método getCodigo dos filhos para:
	public Integer getCodigo(){
		this.codigo = super.getCodigo();
		return codigo;
	}
As vezes ficamos cegos ao problema...

Olavo Jr.