【问题标题】:Java Hibernate error - class is not mappedJava Hibernate 错误 - 类未映射
【发布时间】:2020-04-20 18:15:46
【问题描述】:

我有一个产品数据库。我创建了一个简单的 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;
    }

令人惊讶的是,将产品添加到数据库中工作正常。

【问题讨论】:

  • java 类中是否只需要混合大小写而不是复数 name = "Product"?受影响的机制使用Product 而不是Products。 SQL 使用p.id,其中架构有prod_id。顺便说一句,如果主键被声明为非空值会更容易。

标签: java mysql spring hibernate


【解决方案1】:

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

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

为了更好的理解,你可以看看name attribute in @Entity and @Table

【讨论】:

    【解决方案2】:
    @Entity(name = "products")
    

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

    试试

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多