[英]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 ,可以执行以下操作。
使用下面的行休眠设置。
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.