To tentando mapear uma associação de classes no hibernate através de uma Interface, com a annotation @Any.
O caso é o seguinte: Eu tenho a interface ContaTitular e as classes Funcionario, Empresa e Pessoa que a implementam.
O código da interface ContaTitular é esse:
public interface ContaTitular extends Serializable {
public Long getId();
}
A classe Conta possui dois atributos de ContaTitular, que estão mapeados da seguinte forma:
@Any(metaColumn = @Column(name = "tipo_titular"))
@AnyMetaDef(
idType = "long",
metaType = "string",
metaValues = {
@MetaValue(value = "Funcionario", targetEntity = Funcionario.class),
@MetaValue(value = "Empresa", targetEntity = Empresa.class),
@MetaValue(value = "Pessoa", targetEntity = Pessoa.class)
}
)
@JoinColumn(name = "id_titular")
private ContaTitular titular;
@Any(metaColumn = @Column(name = "tipo_associado"))
@AnyMetaDef(
idType = "long",
metaType = "string",
metaValues = {
@MetaValue(value = "Funcionario", targetEntity = Funcionario.class),
@MetaValue(value = "Empresa", targetEntity = Empresa.class),
@MetaValue(value = "Pessoa", targetEntity = Pessoa.class)
}
)
@JoinColumn(name = "id_associado")
private ContaTitular associado;
O mapeamento funciona normalmente, o problema está em quando eu preciso fazer uma consulta e pegar o titular ou o associado da conta. Estou tentando por Criteria, com o seguinte código:
public ContaTitular getContaTitular(Conta conta) {
Criteria criteria = pm.createCriteria(Conta.class).setFetchMode("titular", FetchMode.SELECT);
criteria.add(Restrictions.eq("id", conta.getId()));
if (criteria.uniqueResult() != null)
return ((Conta)criteria.uniqueResult()).getTitular();
return null;
}
Está dando a seguinte exception:
Caused by: java.lang.UnsupportedOperationException: any types do not have a unique referenced persister
at org.hibernate.type.AnyType.getAssociatedJoinable(AnyType.java:329)
at org.hibernate.loader.JoinWalker.addAssociationToJoinTree(JoinWalker.java:221)
at org.hibernate.loader.JoinWalker.addAssociationToJoinTreeIfNecessary(JoinWalker.java:196)
at org.hibernate.loader.JoinWalker.walkEntityAssociationTree(JoinWalker.java:379)
at org.hibernate.loader.JoinWalker.walkEntityTree(JoinWalker.java:405)
at org.hibernate.loader.JoinWalker.walkEntityTree(JoinWalker.java:270)
at org.hibernate.loader.AbstractEntityJoinWalker.initAll(AbstractEntityJoinWalker.java:69)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:113)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:91)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1577)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:328)
at br.com.b2ml.PlanetConnection.ejb.financeiro.FinanceiroRepositoryBean.getTitularContaSaldo(FinanceiroRepositoryBean.java:577)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011)
at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:175)
at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2920)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4011)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:197)
... 80 more
Alguém tem alguma solução? Achei um caso semelhante no fórum do hibernate mas sem resposta =/
https://forums.hibernate.org/viewtopic.php?f=1&t=978164&start=0