我制作了一个 Hibernate 配置 maven 项目(使用 maven-shade-plugin 构建),以允许我的代码库使用一个统一的“数据库类”。org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped但是,当从正在运行的项目外部调用时,该类似乎没有映射(在运行时引发异常)。当在项目中运行时,一切正常。但是,当从项目外部运行时,Hibernate 无法映射实体。CommonDB.java(maven 包 meta1203-data 的一部分)package com.meta1203.microservices;import java.util.List;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class CommonDB <C extends BaseEntity> { private Configuration cfg; private SessionFactory sf; private Session session; private Class<C> c; public CommonDB(Class<C> anoClass) { String jdbcUrl = String.format( "jdbc:mysql://%s/%s", System.getenv("DB_URL"), System.getenv("DB_NAME")); cfg = new Configuration() .setProperty("hibernate.connection.url", jdbcUrl) .setProperty("hibernate.connection.username", System.getenv("DB_USERNAME")) .setProperty("hibernate.connection.password", System.getenv("DB_PASSWORD")) .setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver") .setProperty("hibernate.connection.pool_size", "1") .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect") .setProperty("hibernate.hbm2ddl.auto", "update") .setProperty("hibernate.show_sql", "true") .addAnnotatedClass(anoClass.getClass()); c = anoClass; } public void open() { sf = cfg.buildSessionFactory(); session = sf.openSession(); } public void close() { session.close(); sf.close(); } public C findOneBy(String field, String o) { String query = "select u from " + c.getSimpleName() + " u where u." + field + " = :id"; return session.createQuery(query, c).setParameter("id", o).getSingleResult(); } // other CRUD functions}
3 回答
慕标5832272
TA贡献1966条经验 获得超4个赞
@Entity
@Table(name = "users")
public class User extends BaseEntity {
您的实体称为“用户”,但它映射到一个称为“用户”的表。
将实体更改为用户或将表更改为用户。
应该可以做到这一点。
翻阅古今
TA贡献1780条经验 获得超5个赞
尝试:
Configuration configuration = new Configuration().configure(); for (Class cls : getEntityClassesFromPackage("com.example.hib.entities")) { configuration.addAnnotatedClass(cls); }
慕姐8265434
TA贡献1813条经验 获得超2个赞
哎呀,我知道发生了什么事。我的银河大脑决定在 Class 对象上执行操作addAnnotatedClass(anoClass.getClass())
,所以我试图将 java.lang.Class 声明为 Hibernate 实体...哦,好吧,我只是个白痴。将其更改为 justaddAnnotatedClass(anoClass)
并且效果很好。
添加回答
举报
0/150
提交
取消