java - 即使在 persistence.xml 中指定,JPA 2.1 也不会从 .sql 文件插入行

标签 java hibernate maven hsqldb jpa-2.1

我正在尝试从 sql 文件插入 HSQL 数据库。我尝试按照本教程https://antoniogoncalves.org/2014/12/11/generating-database-schemas-with-jpa-2-1/进行操作 它不会从 sql 文件加载我的行。我不确定我哪里出错了。请帮忙。我的文件是:

持久性.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
    <description>JPA Test</description>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.jpa.entity.Person</class>
    <properties>

        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
        <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        <property name="hibernate.show_sql" value="true" />
        <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:unittests" />
        <property name="javax.persistence.jdbc.user" value="sa" />
        <property name="javax.persistence.jdbc.password" value="" />
        <property name="javax.persistence.sql-load-script-source"
            value="import.sql" />
    </properties>
</persistence-unit>

导入.sql

    insert into table Person(person_ID, person_name, age) values(101, "Name1", 30 );
    insert into Person(person_ID, person_name, age) values(102, "Name2", 30 );

Person.java

    package com.jpa.entity;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;

    @Entity
    @Table(name="Person")
    public class Person {

@Id
@Column(name="person_ID")
private int id;

@Column(name="person_name")
private String name;

@Column(name="age")
private int age;

//generated public getters and setters

DemoJPA.java

    package com.jpa.demo;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;

    import com.jpa.entity.Person;
    public class DemoJPA {

private static final EntityManagerFactory emf;
static{

    emf = Persistence.createEntityManagerFactory("persistenceUnit");
}
public static EntityManager getEntityManager(){
    return emf.createEntityManager();
}
public static void main(String[] args) {
    // TODO Auto-generated method stub

    Persistence.generateSchema("persistenceUnit", null);
    EntityManager em = getEntityManager();  
    em.getTransaction().begin();

    Person f = new Person();
    f.setId(1);
    f.setName("Name1");
    f.setAge(29);
    em.persist(f);

    em.getTransaction().commit();
    em.clear();
    System.out.println("Done");

        }
    }

我的文件夹结构是: folderStructure

pom.xml

    <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.jpa.entity</groupId>
      <artifactId>JPA2Project</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
              <source>1.7</source>
              <target>1.7</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
      <properties>
          <hibernate.version>4.3.5.Final</hibernate.version>
        <slf4j.version>1.7.5</slf4j.version>
        <log4j.version>1.7.5</log4j.version>
    </properties>
      <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-entitymanager</artifactId>
          <version>${hibernate.version}</version>
        </dependency>
         <dependency>
      <groupId>org.hsqldb</groupId>
      <artifactId>hsqldb</artifactId>
      <version>2.3.2</version>
     </dependency>
         <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    </dependencies>
    </project>

最佳答案

persistence.xml 文件中,我在末尾的属性标记中添加了以下代码:

    <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
    <property name="javax.persistence.schema-generation.create-source" value="metadata"/>
    <property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
    <property name="javax.persistence.sql-load-script-source" value="import.sql"/>

import.sql 文件位于 src/main/resources 文件夹中。我们还可以将其放在 META-INF 文件夹中,并将其引用为 META-INF/import.sql, 我还使用正确的查询编辑了 import.sql。 如果我们需要模型即@Entity(又名元数据)来管理数据库模式,则使用此代码。

关于java - 即使在 persistence.xml 中指定,JPA 2.1 也不会从 .sql 文件插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37400023/

相关文章:

java - 如何验证传入的 JSON 并检查缺少的属性? [ jackson , Jersey ]

java - Spring Boot - 出现意外错误(类型=错误请求,状态=400)。缺少必需的请求正文

java - Spring Data JPA - 为现有集合模拟 "create + join"查询

maven - 如何通过 Tycho maven 插件使用代理?

java - 找不到 Spring Boot 2 包

Java 对象在 Tomcat session 中占用太多空间(遗留代码)

java - 我如何在 Java 中读取使用 libreoffice 构建的 HSQL 数据库?

maven - 如何使用以太获取所有 Maven 依赖项?

java - Android Java 在单独的线程中运行类似于 C# 风格的 Action 列表

java - 支持 JavaFX + Spring Boot + Hibernate 应用程序中的多种环境