我目前正在使用Eclipse中基于Maven的项目,我希望使用Hibernate + JPA连接到数据库。我创建了一个persistence.xml
文件并将其放在目录<project>/src/main/resources/META-INF
中。当我运行应用程序时,它将抛出已知的异常No Persistence provider for EntityManager named
我的persistence.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
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">
<persistence-unit name="NetworkMonDB">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
</properties>
</persistence-unit>
我如何在我的应用程序中初始化它:
public void initializeDatabase(){
final HashMap<String, String> dbConfig = new HashMap<String, String>();
dbConfig.put("javax.persistence.jdbc.url", this.properties.getProperty("database.uri"));
dbConfig.put("javax.persistence.jdbc.user", this.properties.getProperty("database.usr"));
dbConfig.put("javax.persistence.jdbc.password", this.properties.getProperty("database.psw"));
final EntityManagerFactory factory = Persistence.createEntityManagerFactory("NetworkMonDB", dbConfig); //exception thrown at this point.
this.entityManager = factory.createEntityManager();
}
这是我的Maven依赖:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.2.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>
我进行了一些进一步的测试(参见以前关于识别问题的评论的编辑),似乎问题来自我目前使用的安全策略。虽然我有一个安全策略文件,可以在构建应用程序并将其打包到jar文件中时使用,但我没有一个可以在Eclipse IDE中运行的文件。一旦我弄清楚配置安全策略的最佳方法,我会将其作为答案发布,除非其他人有答案。
答案 0 :(得分:0)
上述问题是由安全策略和安全管理器的处理引起的。由于此应用程序最终将从硬盘读取,并使用RMI,我需要使用安全管理器和安全策略。但是,在IDE内部工作时,您实际上并不需要在安全策略文件中设置代码库值。
我目前的解决方案是将此作为我的开发区域安全策略:
grant {
permission java.security.AllPermission;
}
然后我部署应用程序时使用的安全策略将如下所示:
grant codeBase "file:./MyApplication.jar" {
permission java.security.AllPermission;
}
我知道最终我需要为部署提供更具体的更具体的安全策略,以便为特定文件位置和网络值授予特定权限,但这应该让我在此之前继续。