繁体   English   中英

Java Hibernate 错误 - 类未映射

[英]Java Hibernate error - class is not mapped

我有一个产品数据库。 我创建了一个简单的 Hibernate 项目来从数据库中检索所有产品。 但是,我在编译代码时遇到以下异常:

产品未映射

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Product is not mapped [SELECT p FROM Product p]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:350)
    at databases.ProductsDB.getProducts(ProductsDB.java:36)
    at runnable.TestDriver.main(TestDriver.java:14)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Product is not mapped [SELECT p FROM Product p]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:342)
    ... 2 more
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Product is not mapped
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189)
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109)
    at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:332)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3678)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3567)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:708)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:564)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
    ... 10 more

Product类确实被映射了——至少我是这么看的。

MySQL数据库

mysql> describe products;
+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| prod_id       | int(11)       | NO   | PRI | NULL    |       |
| prod_name     | varchar(30)   | NO   |     | NULL    |       |
| prod_price    | decimal(10,2) | NO   |     | NULL    |       |
| prod_category | char(5)       | NO   |     | NULL    |       |
+---------------+---------------+------+-----+---------+-------+

Java类产品

@Entity(name = "products")
public class Product implements Serializable {
    @Id
    @Column(name = "prod_id", unique = true)
    private int id;
    @Column(name = "prod_name", nullable = false)
    private String name;
    @Column(name = "prod_price", nullable = false)
    private BigDecimal price;
    @Column(name = "prod_category", nullable = false)
    private String category;

    //skipping the constructor, setters and getters
}

.xml 文件

<persistence-unit name="Products_manager" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>products.Product</class>

受影响的方法

public static List<Product> getProducts() {
        EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();
        String query = "SELECT p FROM Product p WHERE p.id IS NOT NULL";
        TypedQuery<Product> tq = em.createQuery(query, Product.class);
        List<Product> products;
        try {
            products = tq.getResultList();
            return products;
        }
        catch(NoResultException e) {
            e.printStackTrace();
        }
        finally {
            em.close();
        }
        return null;
    }

令人惊讶的是,将产品添加到数据库中效果很好。

要验证表名应该是“product”还是 products ,可以执行以下操作。

  1. 在mysql中创建一个testdb
  2. 使用下面的行休眠设置。

     hibernate.hbm2ddl.auto= create

这将自动在 testdb 中创建表。 这将帮助您了解“产品”或“产品”是否正确。

String query = "SELECT p FROM product p WHERE p.id IS NOT NULL";

必须改为

String query = "SELECT p FROM products p WHERE p.id IS NOT NULL";
@Entity(name = "products")

此名称用于引用查询中的实体

尝试

String query = "SELECT p FROM products p WHERE p.id IS NOT NULL";

如果您像这样声明实体类,您的代码将正常工作:

@Entity
@Table(name = "products")
public class Product implements Serializable {
    @Id
    @Column(name = "prod_id", unique = true)
    private int id;
    //...
    //...
}

为了更好地理解,您可以在@Entity 和@Table 中查看名称属性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM