Java org.hibernate.hql.internal.ast.QuerySyntaxException:未映射实体
当我试图运行一个打包成胖罐子的spring启动应用程序时,我遇到了一些奇怪的问题 该应用程序与Eclipse和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
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();
}
}