Java org.hibernate.hql.internal.ast.QuerySyntaxException:未映射实体

Java org.hibernate.hql.internal.ast.QuerySyntaxException:未映射实体,java,spring,hibernate,maven,spring-boot,Java,Spring,Hibernate,Maven,Spring Boot,当我试图运行一个打包成胖罐子的spring启动应用程序时,我遇到了一些奇怪的问题 该应用程序与Eclipse和mvn spring boot:run完美配合,但当我使用java-jar myjar时,hibernate实体没有映射 Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Entity is not mapped at org.hibernate.hql.internal.ast.util.Se

当我试图运行一个打包成胖罐子的spring启动应用程序时,我遇到了一些奇怪的问题

该应用程序与Eclipse和
mvn spring boot:run
完美配合,但当我使用
java-jar myjar
时,hibernate实体没有映射

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Entity is not mapped
        at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:169) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
我知道
mvn-spring-boot:run
是不同的,因为它改变了类路径,但是有没有一种方法可以用verbose运行它,这样我就可以看到类路径是什么,这样我就可以用
java-jar
处理类似的东西了

当我打印
System.getProperty(“java.class.path”)

我得到以下信息

 Classpath:/usr/local/apache-maven/boot/plexus-classworlds-2.5.2.jar
当我从
java-jar myJar.jar
运行它时,我得到了
myJar.jar
,所以这可能就是它不工作的原因

以下是pom文件:

Api(包含主类)

下面是api内部的配置

@Configuration
@ApplicationPath("/api")
public class ApiConfiguration extends ResourceConfig {
    public static final String CONFIG_FILE_NAME = "api.properties";

    public ApiConfiguration() {
        register(com.foo.api.v1.controllers.aController.class);
    }
}
这是服务库中的配置

@Configuration
@ComponentScan("com.foo.service")
@EnableTransactionManagement
public class ServiceConfiguration {

    @Bean
    public PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor() {
        return new PersistenceAnnotationBeanPostProcessor();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean () {
        return new LocalContainerEntityManagerFactoryBean();
    }

    @Bean
    public JpaTransactionManager jpaTransactionManager() {
        return new JpaTransactionManager();
    }
}
我在com.foo.service中有常规的hibernate实体


我用
mvn clean install
打包jar,然后用
java-jar和所有依赖项运行它。jar

我需要知道一些细节才能帮助您:

1-你是如何包装到脂肪罐的? 2-你如何运行它

Springboot不能像任何其他应用程序一样打包在胖jar中,正如您所提到的,它会更改类路径以正确使用Springboot自动配置

我最近为springboot应用程序创建了一个fatjar,它工作得很好,但我必须使用重新打包的gradle插件来正确地重新组装这个jar。这个插件是由spring开发的,maven可能也有同样的插件

你看过这里吗

请记住,即使您错误地配置了应用程序,Eclipse也会使用一些类路径魔法来完成任务

  • 您在哪里指定了EntityScan路径?问题可能是spring不扫描包
  • 您是否忘记像spring.profiles.active这样将参数传递给java-jar
对于fatJar,您需要:

  • 特殊springboot包装(使用插件)
  • 指定主类(您已经这样做了)
  • 通过所需的系统参数(配置文件等)

关于最后一点,我注意到,SpRunBooD打包在使用java -jar时运行时没有考虑我的-D参数,我必须使用JavaExcPrdle插件。p> 您能显示主Spring引导类和您试图访问的实体吗?当您试图从数据库中存储或检索对象,但配置未将对象类定义为实体时,会引发该错误。@Yserbius updated。非常感谢。我已经用丢失的信息更新了问题。我使用spring boot maven插件来打包api,我尝试了EntityScan,但没有成功。我不确定是否需要EntityScan。我认为配置中存在一些混乱。在ServiceConfiguration类中,您添加了一个componentScan,如果我理解得很好,它将指定哪个包包含实体,对吗?ComponentScan主要扫描组件和服务注释。您需要添加EntityScan并在此批注的basePackages属性中指定包,以指向您的实体。您还必须使用@entity注释实体类,如果类名不匹配,则为数据库表指定名称。我尝试了EntityScan和basePackage,但没有成功。我确信这与它的打包方式有关,因为它在eclipse和mvn spring boot:run中工作。它可能使用不同的类路径调用jar。我希望我能找到它的作用,为类路径添加一些魔力,在使用java-jar执行时不能依赖它。

@SpringBootApplication
@ComponentScan("com.foo")
public class Application  extends SpringBootServletInitializer {
    private static final Logger LOG = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        if (!argurmentsValid(args)) {
            return;
        }

        final SpringApplication app = new SpringApplication(Application.class);
        app.setBannerMode(Banner.Mode.OFF);
        app.run(args);
    }
}
@Configuration
@ApplicationPath("/api")
public class ApiConfiguration extends ResourceConfig {
    public static final String CONFIG_FILE_NAME = "api.properties";

    public ApiConfiguration() {
        register(com.foo.api.v1.controllers.aController.class);
    }
}
@Configuration
@ComponentScan("com.foo.service")
@EnableTransactionManagement
public class ServiceConfiguration {

    @Bean
    public PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor() {
        return new PersistenceAnnotationBeanPostProcessor();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean () {
        return new LocalContainerEntityManagerFactoryBean();
    }

    @Bean
    public JpaTransactionManager jpaTransactionManager() {
        return new JpaTransactionManager();
    }
}