Java createEntityManagerFactory(“某物”)返回null
我正在学习JPA与样本项目。每当我执行程序时,它都返回null。我检查了跟踪 ,但这并没有帮助。请帮帮我。我被困了两天。我不知道我在哪里犯错 以下异常总是发生Java createEntityManagerFactory(“某物”)返回null,java,postgresql,hibernate,jpa,Java,Postgresql,Hibernate,Jpa,我正在学习JPA与样本项目。每当我执行程序时,它都返回null。我检查了跟踪 ,但这并没有帮助。请帮帮我。我被困了两天。我不知道我在哪里犯错 以下异常总是发生 1605 [main] DEBUG org.hibernate.boot.internal.BootstrapContextImpl - Injecting ScanEnvironment [org.hibernate.jpa.boot.internal.StandardJpaScanEnvironmentImpl@482e36] in
1605 [main] DEBUG org.hibernate.boot.internal.BootstrapContextImpl - Injecting ScanEnvironment [org.hibernate.jpa.boot.internal.StandardJpaScanEnvironmentImpl@482e36] into BootstrapContext; was [null]
1606 [main] DEBUG org.hibernate.boot.internal.BootstrapContextImpl - Injecting ScanOptions [org.hibernate.boot.archive.scan.internal.StandardScanOptions@967906] into BootstrapContext; was [org.hibernate.boot.archive.scan.internal.StandardScanOptions@18dfcc1]
Exception in thread "main" java.lang.NullPointerException
at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassDescriptor(ClassFileArchiveEntryHandler.java:84)
at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassDescriptor(ClassFileArchiveEntryHandler.java:67)
at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.handleEntry(ClassFileArchiveEntryHandler.java:53)
at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.visitArchive(JarFileBasedArchiveDescriptor.java:147)
at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:47)
at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:76)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:98)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:242)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:175)
at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:76)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:171)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:119)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:61)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:50)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at com.test.jpa.App.main(App.java:19)
这是映射类
package com.test.jpa;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "client")
public class User {
@Column(name = "name")
private String name = null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Column(name = "age")
private int age = 0;
@Id
@Column(name = "No")
private int No = 0;
public int getNo() {
return No;
}
public void setNo(int no) {
No = no;
}
}
pom文件
<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.test</groupId>
<artifactId>jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>jpa</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.11.Final</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<optimize>true</optimize>
<debug>true</debug>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<dependencySets>
<dependencySet>
<includes>
<include>*:jar:*</include>
</includes>
<excludes>
<exclude>*:sources</exclude>
<exclude>*:javadoc</exclude>
</excludes>
</dependencySet>
</dependencySets>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.test.jpa.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
当它被执行时,不会抛出空指针异常。它像follow一样打印,然后传递到successive execution
844 [main] DEBUG org.hibernate.boot.internal.BootstrapContextImpl - Injecting ScanEnvironment [org.hibernate.jpa.boot.internal.StandardJpaScanEnvironmentImpl@45312be2] into BootstrapContext; was [null]
844 [main] DEBUG org.hibernate.boot.internal.BootstrapContextImpl - Injecting ScanOptions [org.hibernate.boot.archive.scan.internal.StandardScanOptions@7fb95505] into BootstrapContext; was [org.hibernate.boot.archive.scan.internal.StandardScanOptions@58be6e8]
903 [main] DEBUG org.hibernate.boot.internal.BootstrapContextImpl - Injecting JPA temp ClassLoader [null] into BootstrapContext; was [null]
903 [main] DEBUG org.hibernate.boot.internal.ClassLoaderAccessImpl - ClassLoaderAccessImpl#injectTempClassLoader(null) [was null]
但当在命令行中使用包装良好的jar执行时,会抛出exeception
1605 [main] DEBUG org.hibernate.boot.internal.BootstrapContextImpl - Injecting ScanEnvironment [org.hibernate.jpa.boot.internal.StandardJpaScanEnvironmentImpl@482e36] into BootstrapContext; was [null]
1606 [main] DEBUG org.hibernate.boot.internal.BootstrapContextImpl - Injecting ScanOptions [org.hibernate.boot.archive.scan.internal.StandardScanOptions@967906] into BootstrapContext; was [org.hibernate.boot.archive.scan.internal.StandardScanOptions@18dfcc1]
Exception in thread "main" java.lang.NullPointerException
谢谢构建期间的打包问题 你的配置看起来不错。可能是包装问题。尝试使用以下命令构建并运行您的项目,它将正常工作:
mvn clean compile assembly:single
java -jar target/jpa-0.0.1-SNAPSHOT-jar-with-dependencies.jar
看看这个答案,了解更多关于如何创建具有依赖项的jar的信息。
为了正确起见,请提供更多详细信息:
hibernate:hibernate核心是要使用的正确依赖项。
hibernate:hibernate entitymanager不推荐使用,实际上只指向hibernate核心
jar内的引用:
Hibernate的JPA支持已经合并到Hibernate核心中
模块,使此hibernate entitymanager模块过时。这
模块将在Hibernate ORM 6.0中删除。它只在这里保存了一段时间
不同的使用者期望在一个数据库中有一组静态的工件名称
Hibernate版本的数量。看见
我解决了这个问题。这是依赖性问题。在pom文件中,我添加了以下内容
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.12.Final</version>
</dependency>
org.hibernate
休眠实体管理器
5.4.12.最终版本
并删除了以下依赖项
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.11.Final</version>
</dependency>
org.hibernate
冬眠核心
5.4.11.最终版本
hibernate entitymanager将添加所有必要的依赖项。我看不出JPA配置中有任何错误。看起来问题出在你的包装上。你是如何运行这段代码的?@LeonardoCruz谢谢,使用maven汇编插件打包,并在命令行java-jar-jarname中运行。jar@LeonardoCruz文件名为persistence.xml。不是persistent.xml。我更新了问题内容还可以,只是我输入了问题。嗨,谢谢,但是,pom文件已经如你所建议的那样了。你是否也像建议的那样生成jar并运行?是的,兄弟,我修复了依赖关系。clean安装也和你们建议的一样谢谢你们的回答,但,我只使用了hibernate内核,它给了我空指针异常。我不知道为什么。hibernate entitymanager只解决了我的问题。应该在hibernate core中添加任何其他依赖项吗?我不这么认为,只有hibernate core是必需的,所有其他依赖项都是可传递加载的。您可以使用mvn依赖项来检查这一点:treeHi jagadeesh,它现在工作很好,但我认为它不是解决方案。请看一下我的答案。我添加了更多细节以使其更精确。这是。正如您所发现的,使用hibernate entitymanager 5.4.12.Final修复了这个问题,但只是因为版本冲突;它应该与hibernate core 5.4.12.Final一起工作,避免使用不推荐的hibernate entitymanager。
mvn clean compile assembly:single
java -jar target/jpa-0.0.1-SNAPSHOT-jar-with-dependencies.jar
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.12.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.11.Final</version>
</dependency>