【问题标题】:play 2.5, hibernate : table is not mapped玩 2.5,休眠:表未映射
【发布时间】:2016-07-19 07:30:52
【问题描述】:

我在下面遇到了一个异常

(异常是: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”(开发环境)运行的,这个异常就不会发生。

这意味着......仅在生产环境中我得到了这个异常。

我该如何解决它。

请帮帮我。

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

  • 系统环境:

1) 播放:2.5.4

2) 休眠:5.2.1.final

  • 异常信息:

    原因:org.hibernate.hql.internal.ast.QuerySyntaxException: 用户未映射 [从用户 u 中选择 u,其中 u.email = :email 和 u.secretHash = :secretHash] 在 org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79) 在 org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:115) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:77) 在 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:用户未映射 在 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) 在 org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:321) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3690) 在 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) 在 org.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;
    }
    

【问题讨论】:

    标签: hibernate playframework


    【解决方案1】:

    persistence.xml 中缺少用户映射。我无法从 sn-ps 中看到 User 定义在哪个包中,但我们假设它在包 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>
    

    【讨论】:

    • 这对我有用,谢谢!我在 hibernate.cfg.xml 中有映射,但在 persistence.xml 中没有。它应该只在persistence.xml中吗?
    • 我很高兴它有效。您应该只将映射放入 persistence.xml。
    【解决方案2】:

    Play 2.4 中似乎引入了一个错误。您需要将以下行添加到您的 build.sbt 作为解决方法。

    PlayKeys.externalizeResources := false
    

    这似乎与在 prod 模式下如何加载类有关。

    See here for more info

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2013-02-09
      • 2019-12-03
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多