2016-11-21 108 views
0

我目前正在使用Hibernate + JPA連接到數據庫的Eclipse中基於Maven的項目。我創建了一個persistence.xml文件並將其放在目錄<project>/src/main/resources/META-INF中。當我運行該應用程序就會拋出了非常著名的例外No Persistence provider for EntityManager namedJava安全策略阻止訪問Maven資源文件

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

上述問題是由安全策略和安全管理器的處理引起的。由於此應用程序最終將從硬盤驅動器中讀取,並且使用RMI,我需要使用安全管理器和安全策略。但是,在IDE內部工作時,實際上並不需要在安全策略文件中設置代碼庫值。

我目前的解決辦法是讓這個作爲我的開發區域的安全策略:

grant { 
    permission java.security.AllPermission; 
} 

再使用的安全策略時,部署應用程序應該是這樣的:

grant codeBase "file:./MyApplication.jar" { 
    permission java.security.AllPermission; 
} 

我知道最終我需要提供一個更好的更具體的安全策略來部署,爲特定的文件位置和網絡值授予特定的權限,但這應該讓我一直持續到那時。