元模型和 Persistence.xml 文件

Posted

技术标签:

【中文标题】元模型和 Persistence.xml 文件【英文标题】:Metamodel and the Persistence.xml file 【发布时间】:2022-01-19 04:56:57 【问题描述】:

我是 Spring Framework 的新手,正在尝试为 sql 数据库创建动态搜索查询 - 类似于以下线程中描述的内容。

Filtering database rows with spring-data-jpa and spring-mvc

这个线程提供了一个有用的指南,但是我在生成所描述的元模型文件时遇到了问题。我知道这是一个常见问题,我已尝试实施网上已有的解决方案,但没有奏效。

我在理解 Persistence.xml 文件的概念以及在哪里可以找到它时遇到了特殊问题。从我读过的内容来看,它的功能似乎与我的 'application.properties 文件非常相似。 Persistence.xml 文件显然是生成元模型所必需的。关于它的位置,我找到了以下答案,但老实说,我也不太明白。

“需要驻留在 Java 类路径根目录中的 META-INF 文件夹” "persistence.xml应该位于WAR文件的WEB-INF/classes/META-INF目录"

我正在使用 Eclipse 中的一个 maven 项目,我能找到的唯一 META-INF 目录位于“Maven 依赖项”中的 jar 文件中应该自动生成“persistence.xml”文件还是需要创建是我自己吗?如果有,在哪里?我添加了一个旨在生成它的插件,但它没有工作。

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifestFile>$project.build.outputDirectory/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>
            </plugin>

我还担心我可能没有对项目“属性”应用正确的更改。我已启用“注释处理”并将“生成的测试源字典”设置为默认值“.apt_generated”。这可以吗,还是我应该将生成的测试源字典命名为其他名称?

我已将推荐的依赖项添加到我的 pom 文件中-

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>5.6.2.Final</version>
        </dependency>

以及以下插件:

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.3</version>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>target/metamodel</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

当我尝试重建/运行项目时,它像以前一样运行,控制台中没有显示任何错误,也没有生成新的元模型类(_files 仍然无法识别)

请看下面我的 pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bron</groupId>
    <artifactId>demoJPA</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demoJPA</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <!-- Spring JPA -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.5.6</version>

        </dependency>
        <dependency>
            <!-- Spring starter web -->

            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>





        <!-- E-mail sending capabilities -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>


        <!-- Connect to mysql database -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>



        <!-- Connect to mySQL database -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.5.6</version>
            <scope>test</scope>
        </dependency>

        <!--Reduce boiler plate code -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>


        <!--Spring security -->
        <dependency>
            <groupId>org.springframework.security.oauth.boot</groupId>
            <artifactId>spring-security-oauth2-autoconfigure</artifactId>
            <version>2.5.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.security.experimental</groupId>
            <artifactId>spring-security-oauth2-authorization-server</artifactId>
            <version>0.1.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.5.6</version>
        </dependency>



        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>2.6.0</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>5.6.2.Final</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>


            <plugin>
                <groupId>org.bsc.maven</groupId>
                <artifactId>maven-processor-plugin</artifactId>
                <executions>
                    <execution>
                        <id>process</id>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <phase>generate-sources</phase>
                        <configuration>
                            <!-- source output directory -->
                            <outputDirectory>target/metamodel</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-proc:none</compilerArgument>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.3</version>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>target/metamodel</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifestFile>$project.build.outputDirectory/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>
            </plugin>
        </plugins>



    </build>





</project>

因为我是 Spring 和一般复杂框架的新手,我发现我读过的解决方案很难理解并应用于我的项目。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

    persistence.xml 应该在src/main/resources/META-INF/ 中,如果该路径的任何文件夹不存在,您必须自己创建它们,还必须使用你想要的配置。

    元模型生成应该可以工作,但是我不熟悉您用来添加源的插件,我可以给您一个除了我知道它可以工作的 pom 之外的内容:

    元模型类应该在使用 mvn install (mvn clean install) 时生成,确保使用 maven 安装项目以生成类似的东西,使用 IDE 运行/构建命令很可能不起作用,因为它对 pom 没有任何作用。

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.6.0</version>
  <executions>
    <execution>
      <goals>
        <goal>java</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <arguments>
      <argument>--output</argument>
      <argument>target/generated-sources/</argument>
    </arguments>
  </configuration>
</plugin>
    您使用的是maven-jar-plugin,这让我有点困惑,因为我认为您想创建一个Web 应用程序,所以应该生成一个war 文件。您只需在 pom 中 &lt;project&gt; 下的任意位置添加 &lt;packaging&gt;war&lt;/packaging&gt; 即可实现这一点(例如在您的 &lt;artifactId&gt; 下)

【讨论】:

非常感谢!

以上是关于元模型和 Persistence.xml 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何为 JPA 和 Hibernate 创建一个 persistence.xml 文件?

没有persistence.xml的JPA

在 spring-context.xml 和 persistence.xml 中加载 .properties

JPA的配置文件persistence.xml参数详解

如何设置可移植的 persistence.xml 文件?

persistence.xml 从 .properties 文件导入数据库参数值