代码之家  ›  专栏  ›  技术社区  ›  Marc

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

  •  2
  • Marc  · 技术社区  · 6 年前

    当我试图运行一个打包成胖jar的spring启动应用程序时,我面临着一些奇怪的问题。

    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]
    

    我知道 是不同的,因为它改变了类路径,但是有没有一种方法可以用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 所以这可能就是它不起作用的原因。

    Api(包含主类)

    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.foo</groupId>
        <artifactId>api</artifactId>
        <version>0.0.2-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <url>http://maven.apache.org</url>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.3.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jersey</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
            </dependency>
    
    
            <dependency>
                <groupId>com.foo</groupId>
                <artifactId>service</artifactId>
                <version>0.0.2-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>com.jayway.jsonpath</groupId>
                <artifactId>json-path</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.9.2</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-api</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.9.2</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-api</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-jersey2-jaxrs</artifactId>
                <version>1.5.13</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-api</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                            <configuration>
                                <classifier>jar-with-all-dependencies</classifier>
                                <mainClass>
                                  ${main-class-path}
                                </mainClass>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    服务(包含hibernate逻辑)

    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.foo</groupId>
    <artifactId>service</artifactId>
    <version>0.0.2-SNAPSHOT</version>
    <packaging>jar</packaging>
    
    <dependencies>
    
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${org-springframework.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org-springframework.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>${org-springframework-data.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.threeten</groupId>
            <artifactId>threetenbp</artifactId>
            <version>1.3.6</version>
        </dependency>
    
        <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-orm</artifactId>
           <version>${org-springframework.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey-media-json-jackson.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate-core.version}</version>
        </dependency>
    
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>
    
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${querydsl.version}</version>
            <scope>provided</scope>
        </dependency>
    
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>${apt-maven-plugin.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/apt</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    这是主课

    @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);
        }
    }
    

    下面是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 然后我用 java -jar jar-with-all-dependencies.jar

    1 回复  |  直到 6 年前
        1
  •  0
  •   Olivier Garand    6 年前

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

    1-你是怎么包装成胖罐子的? 2-你是怎么操作的?

    我最近为springboot应用程序创建了一个fatjar,它运行得很好,但是我不得不使用重新打包的gradle插件来正确地重新组装jar。这个插件是spring做的,你可能和maven有相同的地方。

    你看过这里吗?: https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html

    产科加强生命支持

    • 您在哪里指定了EntityScan路径?问题可能是弹簧,不要扫描包裹
    • 你忘了给java-jar传递参数了吗,比如spring.profiles.active?

    对于fatJar,您需要:

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

    关于最后一点,我注意到springboot打包在使用java-jar运行时没有考虑我的-D参数,我不得不使用JavaExec gradle插件。