我正在處理需要同時使用JPA/Hibernate和RMI的應用程序。由於RMI需要使用安全策略來確保正確分配對網絡的訪問權限,因此我現在不得不擔心文件夾權限。什麼是正確的安全策略值設置,以允許RMI和JPA /休眠同時工作
我一直在網上尋找(和在這裏)幾天,現在試圖找到解決這個問題。基本上問題是,對於JPA /休眠工作,我必須將persistence.xml
文件放在META-INF
目錄中,並且META-INF
目錄必須位於我項目的src
目錄下(這對我來說沒有任何意義,但它工作正常) 。因此,該項目的佈局基本上是:
org.project.root
|
|>src
| |
| |>org.project.package
| |
| |>META-INF
| |
| |>persistence.xml
|
|>config
|
|>database
|
|>logs
我我一直在試圖授予該文件夾${user.dir}${/}src${/}META-INF${/}-
讀訪問的安全策略文件,但是,當我嘗試運行應用程序,我得到的錯誤No Persistence provider for EntityManager named DERBY_ACPSTORE_CREATE
。然而,我的persistence.xml文件確實包含了這一點,它在註釋掉所有RMI內容並停止讀取安全策略時起作用。所以我的問題是如何讓我的安全策略文件允許我讀取persistence.xml文件?
更新1
運用@Vineet雷諾茲我能夠該文件的路徑使用的是看建議的路徑信息:
File f = new File("META-INF/persistence.xml");
System.out.println(f.getAbsolutePath());
不過,我仍然得到這個錯誤,當我試圖創建數據庫。
javax.persistence.PersistenceException: No Persistence provider for EntityManager named DERBY_ACPSTORE_CREATE
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
at org.myproject.data.DBInit.dbInit(DBInit.java:29)
at org.myproject.ACPStoreMainService.main(ACPStoreMainService.java:91)
我的persistence.xml正如我所說的工作罰款之前,我開始使用的安全策略,所以我知道,持久性單元「DERBY_ACPSTORE_CREATE」存在和正確的。
更新2
雖然我不知道這是很好的,因爲它工作時,我不使用安全策略,這裏是我的persistence.xml內容:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="DERBY_ACPSTORE_CREATE">
<provider>org.hibernate.ejb.HibernatePersistence</provider
<class>org.myproject.data.MessageHistory</class>
<properties>
<property name="hibernate.connection.driver_class"
value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" />
<property name="hibernate.connection.url" value="jdbc:derby:database/acpstore;create=true" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="use_sql_comments" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.connection.username" value="user" />
<property name="hibernate.connection.password" value="password" />
</properties>
</persistence-unit>
</persistence>
UPDATE 3
正如我在下面的Vineet Reynolds的回答中所提到的,我已經測試了沒有安全性的persistence.xml,現在它正在工作。然後,當我恢復安全策略時,我再次得到錯誤。因此下面是我的安全策略的內容,我怎麼在我的應用程序創建安全:
grant {
permission java.lang.RuntimePermission "shutdownHooks";
permission java.lang.RuntimePermission "readFileDescriptor";
permission java.lang.RuntimePermission "writeFileDescriptor";
permission java.util.PropertyPermission "user.dir", "read";
permission java.net.SocketPermission "172.10.10.21:1024-65535", "connect, accept, resolve";
permission java.net.SocketPermission "172.10.10.21:1-1023", "connect,resolve";
permission java.io.FilePermission "${user.dir}${/}META-INF${/}-", "read";
permission java.io.FilePermission "${user.dir}${/}config${/}-", "read, write, delete";
permission java.io.FilePermission "${user.dir}${/}database${/}-", "read, write, delete";
};
而且這是在我的應用程序設置安全管理器會發生什麼
if(System.getSecurityManager() == null)
{
System.setSecurityManager(new RMISecurityManager());
}
UPDATE 4
我發現了一條消息,我沒有注意到來自log4j之前。該消息是
[main] INFO org.hibernate.ejb.Ejb3Configuration - Could not find any META-INF/persistence.xml file in the classpath
這對我來說似乎很奇怪。所以我列出了類路徑中的目錄,我發現org.project.root\bin
但不是org.project.root
。我現在知道運行時的META-INF定位爲org.project.root\META-INF
,並且類路徑應該指向org.project.root
,以便JPA和hibernate可以訪問查找persistence.xml。那麼是否會需要以某種方式改變類路徑以匹配這個?
它看起來像我帶來了我的問題同一點,因爲這一個前http://stackoverflow.com/questions/1279060/jpa-with-toplink-no-meta-inf-persistence-xml-was-found-in-classpath但是這個問題似乎沒有被接受的答案,也沒有我沒有檢查過的問題。 – JRSofty 2011-05-27 10:34:28