Hi, Scott
These are the issues we are facing with criteria/metamodel APIs and Jboss-as-7.1.0
As you can see from the attached example (zip file), we are extending an @Entity (TaxAgent) from a @MappedSuperclass (Agent)
Agent has an @Embedded attribute (document), and this generates two errors:
1. When deploying there "Unable to locate static metamodel field" errors. Note that this errors act at two levels, first the document field cannot be found in TaxAgent_ but also, the documentType field cannot be found inside our embeddable, Document_.
2. When trying to create a path expression from the root object (taxAgent) to TaxAgent_.document an exception is thrown (which is below).
3. Also, we've found this:
https://hibernate.onjira.com/browse/HHH-5024 (which is similar but a different hierarchy @Embeddable extending a @MappedSuperclass)
4. At "deploy" time the logger error message as below:
17:15:01,452 ERROR [MetadataContext] Unable to locate static metamodel field : agents.TaxAgent_#document
17:15:01,457 ERROR [MetadataContext] Unable to locate static metamodel field : stuff.Document_#documentType
5. At query time:
public final List<TaxAgent> getList(final String description)
{
List<TaxAgent> taxAgentList = null;
try
{
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<TaxAgent> cq = cb.createQuery(TaxAgent.class);
final Root<TaxAgent> taxAgent = cq.from(TaxAgent.class);
// <- This is the exception line: at service.manager.ejb.TaxAgentManagerEJB.getList(TaxAgentManagerEJB.java:61) [:]
final Path<Document> document = taxAgent.get(TaxAgent_.document);
// final Path<Document> document = taxAgent.get("document"); // <- This works (just in case you were asking)
final Path<String> documentNumber = document.get(Document_.documentNumber);
final StringBuilder sb = new StringBuilder();
sb.append("%").append(description.trim().replaceAll(" ", "%")).append("%");
cq.where(cb.like(cb.upper(cb.trim(documentNumber)), sb.toString().toUpperCase()));
// Gets data.
final TypedQuery<T> tq = em.createQuery(cq);
taxAgentList = tq.getResultList();
}
catch (Throwable t)
{
throw new EJBException(t.getMessage());
}
return taxAgentList;
}
6. Query execution:
2011-11-11 11:24:49,330 ERROR [com.ebizlink.pandora2.web.component.BaseComponent] (http-127.0.0.1-8080-1) null: javax.ejb.EJBException
at service.manager.ejb.TaxAgentManagerEJB.getList(TaxAgentManagerEJB.java:61) [:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_20]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [:1.6.0_20]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.6.0_20]
at java.lang.reflect.Method.invoke(Method.java:616) [:1.6.0_20]
at org.jboss.aop.joinpoint.MethodInvocation.invokeTarget(MethodInvocation.java:122) [jboss-aop.jar:2.2.1.GA]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.interceptors.container.ContainerMethodInvocationWrapper.invokeNext(ContainerMethodInvocationWrapper.java:72) [:1.1.3]
at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.invoke(InterceptorSequencer.java:76) [:1.1.3]
at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.aroundInvoke(InterceptorSequencer.java:62) [:1.1.3]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_20]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [:1.6.0_20]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.6.0_20]
at java.lang.reflect.Method.invoke(Method.java:616) [:1.6.0_20]
at org.jboss.aop.advice.PerJoinpointAdvice.invoke(PerJoinpointAdvice.java:174) [jboss-aop.jar:2.2.1.GA]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.fillMethod(InvocationContextInterceptor.java:74) [:1.1.3]
at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_fillMethod_11985797.invoke(InvocationContextInterceptor_z_fillMethod_11985797.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.setup(InvocationContextInterceptor.java:90) [:1.1.3]
at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_setup_11985797.invoke(InvocationContextInterceptor_z_setup_11985797.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.async.impl.interceptor.AsynchronousServerInterceptor.invoke(AsynchronousServerInterceptor.java:128) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:62) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:56) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42) [:1.0.3]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:68) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.core.context.SessionInvocationContextAdapter.proceed(SessionInvocationContextAdapter.java:95) [:1.7.17]
at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:247) [:0.0.1]
at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.required(CMTTxInterceptor.java:349) [:0.0.1]
at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invoke(CMTTxInterceptor.java:209) [:0.0.1]
at org.jboss.ejb3.tx2.aop.CMTTxInterceptorWrapper.invoke(CMTTxInterceptorWrapper.java:52) [:0.0.1]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76) [:1.0.0.GA]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42) [:1.0.3]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:182) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.core.context.CurrentInvocationContextInterceptor.invoke(CurrentInvocationContextInterceptor.java:47) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67) [:1.0.1]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.interceptor.EJB3TCCLInterceptor.invoke(EJB3TCCLInterceptor.java:86) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:323) [:1.7.17]
at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:380) [:1.7.17]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_20]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [:1.6.0_20]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.6.0_20]
at java.lang.reflect.Method.invoke(Method.java:616) [:1.6.0_20]
at org.jboss.ejb3.proxy.impl.handler.session.SessionLocalProxyInvocationHandler$LocalContainerInvocation.invokeTarget(SessionLocalProxyInvocationHandler.java:184) [:1.0.11]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.async.impl.interceptor.AsynchronousClientInterceptor.invoke(AsynchronousClientInterceptor.java:143) [:1.7.17]
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) [jboss-aop.jar:2.2.1.GA]
at org.jboss.ejb3.proxy.impl.handler.session.SessionLocalProxyInvocationHandler$LocalInvokableContextHandler.invoke(SessionLocalProxyInvocationHandler.java:159) [:1.0.11]
at $Proxy288.invoke(Unknown Source) at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:185) [:1.0.11]
at $Proxy274.getList(Unknown Source) at com.ebizlink.pandora2.web.component.form.BaseAutoCompleteComponent.getList(BaseAutoCompleteComponent.java:73) [:]
at com.ebizlink.pandora2.web.component.form.BaseAutoCompleteComponent.complete(BaseAutoCompleteComponent.java:59) [:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_20]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [:1.6.0_20]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.6.0_20]
at java.lang.reflect.Method.invoke(Method.java:616) [:1.6.0_20]
at org.apache.el.parser.AstValue.invoke(AstValue.java:196) [:6.0.0.Final]
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) [:6.0.0.Final]
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102) [:2.0.3-]
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeResults(AutoCompleteRenderer.java:78) [:]
at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeEnd(AutoCompleteRenderer.java:60) [:]
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879) [:2.0.3-]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650) [:2.0.3-]
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:479) [:2.0.3-]
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:175) [:2.0.3-]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1476) [:2.0.3-]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487) [:2.0.3-]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487) [:2.0.3-]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487) [:2.0.3-]
at javax.faces.component.UIForm.visitTree(UIForm.java:331) [:2.0.3-]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487) [:2.0.3-]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487) [:2.0.3-]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487) [:2.0.3-]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487) [:2.0.3-]
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:361) [:2.0.3-]
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:282) [:2.0.3-]
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:179) [:2.0.3-]
at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:968) [:2.0.3-]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643) [:2.0.3-]
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:378) [:2.0.3-]
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127) [:2.0.3-]
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117) [:2.0.3-]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) [:2.0.3-]
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135) [:2.0.3-]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309) [:2.0.3-]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.0.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.0.0.Final]
at com.ebizlink.adonis.common.ui.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:31) [:]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274) [:6.0.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.0.0.Final]
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) [:]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274) [:6.0.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.0.0.Final]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:6.0.0.Final]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) [:6.0.0.Final]
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.0.0.Final]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:593) [:6.0.0.Final]
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final]
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final]
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.0.0.Final]
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.0.0.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) [:6.0.0.Final]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.0.0.Final]
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.0.0.Final]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.0.0.Final]
at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.0.0.Final]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.0.0.Final]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.0.0.Final]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.0.0.Final]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.0.0.Final]
at java.lang.Thread.run(Thread.java:636) [:1.6.0_20]
2011-11-11 11:24:49,369 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-127.0.0.1-8080-1) java.lang.NullPointerException
===============================================================================
sample code
===============================================================================
package agents;
import java.io.Serializable;
import javax.persistence.Embedded;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.SequenceGenerator;
import stuff.Document;
@MappedSuperclass
@SuppressWarnings("serial")
public abstract class Agent implements Serializable
{
@Id
@SequenceGenerator(name = "id", sequenceName = "agent_seq")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
private Long agentID;
@Embedded
private Document document;
/**
*/
protected Agent(Document document)
{
this.agentID = 0l;
this.document = document;
}
// getters, setters...
}
===============================================================================
sample code
===============================================================================
package agents;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import stuff.Document;
@Entity
@Table(name = "taxagent", uniqueConstraints = @UniqueConstraint(columnNames = {"documentTypeID", "documentNumber"}))
@SuppressWarnings("serial")
public final class TaxAgent extends Agent
{
/**
*/
protected TaxAgent(Document document)
{
super(document);
}
/**
*/
public TaxAgent()
{
this(null);
}
}
===============================================================================
sample code
===============================================================================
package stuff;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Embeddable
@SuppressWarnings("serial")
public final class Document implements Serializable
{
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "documentTypeID")
private DocumentType documentType;
@Column(length = 20)
private String documentNumber;
/**
*/
public Document(DocumentType documentType, String documentNumber)
{
this.documentType = documentType;
this.documentNumber = documentNumber;
}
/**
*/
public Document()
{
this(null, "");
}
// getters, setters...
}
===============================================================================
sample code
===============================================================================
package stuff;
import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "documenttype")
@Cacheable(value = true)
@SuppressWarnings("serial")
public final class DocumentType implements Serializable
{
@Id
@SequenceGenerator(name = "id", sequenceName = "documenttype_seq")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
private Long documentTypeID;
@Column(length = 50, unique = true)
private String description;
/**
*/
public DocumentType(String description)
{
this.documentTypeID = 0l;
this.description = description;
}
/**
*/
public DocumentType()
{
this("");
}
// getters, setters...
}
===============================================================================
sample code
===============================================================================
package agents;
import stuff.Document;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@StaticMetamodel(Agent.class)
public abstract class Agent_ {
public static volatile SingularAttribute<Agent, Document> document;
public static volatile SingularAttribute<Agent, Long> agentID;
}
===============================================================================
sample code
===============================================================================
package agents;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@StaticMetamodel(TaxAgent.class)
public abstract class TaxAgent_ extends agents.Agent_ {
}
===============================================================================
sample code
===============================================================================
package stuff;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@StaticMetamodel(Document.class)
public abstract class Document_ {
public static volatile SingularAttribute<Document, DocumentType> documentType;
public static volatile SingularAttribute<Document, String> documentNumber;
}
===============================================================================
sample code
===============================================================================
package stuff;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@StaticMetamodel(DocumentType.class)
public abstract class DocumentType_ {
public static volatile SingularAttribute<DocumentType, String> description;
public static volatile SingularAttribute<DocumentType, Long> documentTypeID;
}