2016-07-19 78 views
3

我已经越来越下面玩2.5,休眠:表中未映射

一个例外(例外是:org.hibernate.hql.internal.ast.QuerySyntaxException:用户没有被映射)

它发生当这个代码被调用时。

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())); 

但是如果这个项目是由“actirvator start”(开发env)运行的,这个异常没有发生。

它的意思是......只有在生产环境我得到这个例外。

我该如何解决这个问题。

请帮帮我。

感谢您的帮助,我的项目信息如下

  • 系统环境:

1)播放:2.5.4

2)冬眠:5.2.1.final

  • 异常消息:

    引起:org.hibernate.hql.internal.ast.QuerySyntaxException:用户未映射[从用户u中选择u,其中u.email =:email和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) 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) 在org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:521) 在org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java :623) ... 52更多 引起者:org.hibernate.hql.internal.ast.QuerySyntaxException:用户未映射 at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java :171) 在org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91) 在org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:79 ) at org.hibernate.hql.internal.ast.HqlSqlWalker.creat efromElement(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) 在org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:718) 在org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:574) 在有机hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker。的java:311) 在org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:259) 在org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262) 在org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190) ...... 58多个

  • 的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 
    @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; 
    } 
    

回答

0

难道你把@Transactional注释在控制器的方法,你把这个查询?

您也可以到这个模型添加到您的持久性文件,

models.User

+0

这个查询被称为在userDAO的和这个类被称为UserController的。像这样在UserController中注入了事务性注释“@Transactional public class UserController extends Controller” –

+0

我使用这个包导入了play.db.jpa.JPA;不是jpaApi和我做这样的查询JPA.em()。createQuery(“选择你从用户u u.email =:电子邮件和u.secretHash =:secretHash”,User.class) .setParameter(“email”, parameter.getEmail()) .setParameter(“secretHash”,hashAlgorithm.hash(parameter.getPassword()));和其他事情我已经告诉你是尝试在persistence.xml中添加实体属性 com.yourCompanyName.WhateverEntityClass

1

用户映射缺少在persistence.xml。我无法从片段中看到用户定义的包,但假设它位于包persistence.models中。 persistence.xml中应该是这样的:

<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> 

+0

这对我工作,谢谢!我在hibernate.cfg.xml中有映射,但没有在persistence.xml中。它应该只在persistence.xml中吗? – manyways

+1

我很高兴它的工作原理。您应该只将映射放入persistence.xml中。 – asch

0

它看起来像有在玩2.4引入了一个错误。您需要将以下行添加到您的build.sbt中作为解决方法。

PlayKeys.externalizeResources := false 

它似乎与如何在产品模式下加载类有关。

See here for more info