4

I have been getting a exception below

(Exception is : org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped )

It occured when this code is called.

TypedQuery<User> query = jpaApi.em().createQuery("select u from User u where u.email = :email and u.secretHash = :secretHash", User.class)
            .setParameter("email", parameter.getEmail())
            .setParameter("secretHash", hashAlgorithm.hash(parameter.getPassword()));

but if this project is running by "actirvator start" (develop env), this exception did not occur.

it mean ... only on Production environment i got this exception.

how can i fix it.

please help me.

thanks for your help and my project information is below

  • System environment :

1) Play : 2.5.4

2) hibernate : 5.2.1.final

  • Exception Message :

    Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [select u from User u where u.email = :email and u.secretHash = :secretHash] at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79) at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142) at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:115) at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:77) at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:152) at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:521) at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:623) ... 52 more Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:171) at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91) at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:79) at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:321) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3690) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3579) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:718) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:574) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:311) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:259) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190) ... 58 more

  • persistence.xml

    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <persistence-unit name="Hoth-PersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <non-jta-data-source>DefaultDS</non-jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL94Dialect" />
    
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.use_sql_comments" value="true" />
    
            <property name="hibernate.max_fetch_depth" value="5" />
    
            <property name="hibernate.hbm2ddl.auto" value="update" />
    
            <property name="hibernate.jdbc.batch_size" value="50" />
            <property name="hibernate.jdbc.batch_versioned_data" value="true" />
            <property name="hibernate.order_inserts" value="true" />
        </properties>
    </persistence-unit>
    

  • Entity Class Code

    @Entity
    @Table (name = "users")
    @Getter @Setter @ToString @EqualsAndHashCode (of = "email")
    public class User {
    @Id
    private String email;
    
    @Column(name = "secret_hash")
    private String secretHash;
    
    @Column(name = "accessed_at")
    private LocalDateTime accessedAt;
    
    private String gender;
    
    @Column(name = "birth_year")
    private Integer birthYear;
    
    @Column(name = "picture_name")
    private String pictureName;
    
    @Column(name = "picture_url")
    private String pictureUrl;
    
    private String nickname;
    }
    

2 Answers2

1

The User mapping is missing in the persistence.xml. I cannot see from the snippets in what package the User is defined, but let's suppose it is in the package persistence.models. The persistence.xml should be like this:

<persistence-unit name="Hoth-PersistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<non-jta-data-source>DefaultDS</non-jta-data-source>
<class>persistence.models.User</class>
<properties>
    ...
</properties>

asch
  • 1,923
  • 10
  • 21
  • This worked for me, thanks! I had the mapping in hibernate.cfg.xml, but not in persistence.xml. Should it only be in persistence.xml? – manyways Jul 24 '16 at 10:35
  • 1
    I am glad it works. You should put the mapping only into persistence.xml. – asch Jul 24 '16 at 17:53
1

It looks like there was a bug introduced in Play 2.4. You need to add the following line to your build.sbt as a workaround.

PlayKeys.externalizeResources := false

It appears to be related to how classes are loaded while in prod mode.

See here for more info

uesports135
  • 1,083
  • 2
  • 16
  • 25