Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    Multitenant with JPA

    Greetings,

    I use jpa with EclipseLink.
    isomorphic.version = 10.0-p20150731

    And I have problem when i try to fetch data from @Multitenant beans.
    I override IDACall and in the handleDSRequest and try to set tenantId to EntityManager.

    @Override
    public DSResponse handleDSRequest(DSRequest dsRequest, RPCManager rpc, RequestContext context) throws Exception {
    DataSource dataSource = dsRequest.getDataSource();
    EntityManager em = EMF.getEntityManager(dataSource.getConfigName());
    em.setProperty(EntityManagerProperties.MULTITENANT_PROPERTY_DEFAULT, "domain:1");

    return super.handleDSRequest(dsRequest, rpc, context);
    }

    But I always get: No value was provided for the session property [eclipselink.tenant-id]... These properties must be set through Entity Manager
    Is that the right way?
    I must set be able to set tenant Id on every request.



    <isomorphic.version>10.0-p20150731</isomorphic.version>

    <DataSource
    ID="posConfig"
    serverType="jpa"
    beanClassName="hr.ips.gm.model.expanse.PosConfigValue"
    >
    </DataSource>


    Exception Description: No value was provided for the session property [eclipselink.tenant-id]. This exception is possible when using additional criteria or tenant discriminator columns without specifying the associated contextual property. These properties must be set through Entity Manager, Entity Manager Factory or persistence unit properties. If using native EclipseLink, these properties should be set directly on the session.
    Query: ReportQuery(referenceClass=PosConfigValue sql="SELECT COUNT(id) FROM pos_config_value WHERE (TENANT_ID = ?)")
    12:29:10.153 - WARN c.i.servlet.RequestContext - dsRequest.execute() failed:
    javax.persistence.PersistenceException: Exception [EclipseLink-6174] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.QueryException
    Exception Description: No value was provided for the session property [eclipselink.tenant-id]. This exception is possible when using additional criteria or tenant discriminator columns without specifying the associated contextual property. These properties must be set through Entity Manager, Entity Manager Factory or persistence unit properties. If using native EclipseLink, these properties should be set directly on the session.
    Query: ReportQuery(referenceClass=PosConfigValue sql="SELECT COUNT(id) FROM pos_config_value WHERE (TENANT_ID = ?)")
    at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:480) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at com.isomorphic.jpa.JPADataSource.executeFetch(JPADataSource.java:712) ~[isomorphic-jpa-10.0-p20150731.jar:na]
    at com.isomorphic.datasource.DataSource.execute(DataSource.java:1922) ~[isomorphic-core-rpc-10.0-p20150731.jar:na]
    at com.isomorphic.jpa.JPADataSource.execute(JPADataSource.java:652) ~[isomorphic-jpa-10.0-p20150731.jar:na]
    at com.isomorphic.application.AppBase.executeDefaultDSOperation(AppBase.java:726) ~[isomorphic-core-rpc-10.0-p20150731.jar:na]
    at com.isomorphic.application.AppBase.executeAppOperation(AppBase.java:658) ~[isomorphic-core-rpc-10.0-p20150731.jar:na]
    at com.isomorphic.application.AppBase.execute(AppBase.java:491) ~[isomorphic-core-rpc-10.0-p20150731.jar:na]
    at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:2548) ~[isomorphic-core-rpc-10.0-p20150731.jar:na]
    at com.isomorphic.servlet.IDACall.handleDSRequest(IDACall.java:220) [isomorphic-core-rpc-10.0-p20150731.jar:na]
    at hr.ips.gm.web.isomorphic.SecureIDACall.handleDSRequest(SecureIDACall.java:46) [classes/:na]
    at com.isomorphic.servlet.IDACall.processRPCTransaction(IDACall.java:185) [isomorphic-core-rpc-10.0-p20150731.jar:na]
    at com.isomorphic.servlet.IDACall.processRequest(IDACall.java:152) [isomorphic-core-rpc-10.0-p20150731.jar:na]
    at hr.ips.gm.web.isomorphic.SecureIDACall.processRequest(SecureIDACall.java:31) [classes/:na]
    at com.isomorphic.servlet.IDACall._processRequest(IDACall.java:117) [isomorphic-core-rpc-10.0-p20150731.jar:na]
    at com.isomorphic.servlet.IDACall.doPost(IDACall.java:76) [isomorphic-core-rpc-10.0-p20150731.jar:na]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) [javax.servlet-api-3.1.0.jar:3.1.0]
    at com.isomorphic.servlet.BaseServlet.service(BaseServlet.java:156) [isomorphic-core-rpc-10.0-p20150731.jar:na]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [javax.servlet-api-3.1.0.jar:3.1.0]
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:751) [jetty-servlet-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1666) [jetty-servlet-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:171) [websocket-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1636) [jetty-servlet-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) [spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1653) [jetty-servlet-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) [spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1645) [jetty-servlet-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:564) [jetty-servlet-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:578) [jetty-security-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1111) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:498) [jetty-servlet-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1045) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:98) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.Server.handle(Server.java:461) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:284) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:244) [jetty-server-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:534) [jetty-io-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607) [jetty-util-9.2.0.v20140526.jar:9.2.0.v20140526]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536) [jetty-util-9.2.0.v20140526.jar:9.2.0.v20140526]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]
    Caused by: org.eclipse.persistence.exceptions.QueryException:
    Exception Description: No value was provided for the session property [eclipselink.tenant-id]. This exception is possible when using additional criteria or tenant discriminator columns without specifying the associated contextual property. These properties must be set through Entity Manager, Entity Manager Factory or persistence unit properties. If using native EclipseLink, these properties should be set directly on the session.
    Query: ReportQuery(referenceClass=PosConfigValue sql="SELECT COUNT(id) FROM pos_config_value WHERE (TENANT_ID = ?)")
    at org.eclipse.persistence.exceptions.QueryException.missingContextPropertyForPropertyParameterExpression(QueryException.java:266) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.expressions.ParameterExpression.getValue(ParameterExpression.java:277) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.databaseaccess.DatabaseCall.translate(DatabaseCall.java:1102) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:241) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:299) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:694) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2738) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllReportQueryRows(ExpressionQueryMechanism.java:2675) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.queries.ReportQuery.executeDatabaseQuery(ReportQuery.java:848) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1127) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:403) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1215) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1786) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1751) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:469) ~[eclipselink-2.5.2.jar:2.5.2.v20140319-9ad6abd]
    ... 46 common frames omitted

    #2
    sorry for the delayed answer, you've most likely figured this out already, but please see below how you access EntityManager that will be actually used by JPADataSource.

    Please take a look at jpaIntegration SmartClient docs. JPA transactions section explains how you may configure different EMF provider depending on what kind of transaction management is required. The default provider is com.isomorphic.jpa.EMFProviderLMT, see docs mentioned earlier for more details and which provider to choose.
    To get access to EntityManager you should subclass one of SmartClient EMF providers and override getEntityManager method, here you may customize EntityManager. Or you may choose none of SmartClient EMF providers and write your own provider implementing com.isomorphic.jpa.EMFProviderInterface, see javadoc for details.
    No matter which way you choose remember that it should be configured in the server.properties file by setting property jpa.emfProvider to the fully qualified class name of the provider.

    Comment

    Working...
    X