我正在使用Netbean6.9.1和JPA EclipseLink構建REST Web應用程序。即使實體標有@Entity註釋,但未知實體類錯誤消息
我面對的是,即使我的實體類MasatoTable標有實體標註的問題,我得到錯誤:
(java.lang.IllegalArgumentException: Unknown entity bean class:
class entity.MasatoTable, please verify that this class
has been marked with the @Entity annotation.)
事情是當我重新從NetbeanIDE的GlassFish3服務器,它適用於過了一段時間,某種程度上,錯誤開始顯現。我曾經使用過Toplink Essential,沒有問題,但我已經更改爲EclipseLink並重新defiend persistence.xml(如下所示),並且此問題已啓動。但我不知道我能想到的任何代碼錯誤..
MasatoTable.java
@Entity
@Table(name = "MasatoTable")
public class MasatoTable implements Serializable {
...continue code...
的persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
<persistence-unit name="kojoPU">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<non-jta-data-source>jdbc/koga_kojo</non-jta-data-source>
<class>entity.MasatoTable</class>
<properties>
<property name="eclipselink.logging.logger" value="JavaLogger"/>
<property name="eclipselink.logging.level.sql" value="FINEST"/>
<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://KOGADBSERVER;databaseName=MasatoDB"/>
<property name="javax.persistence.jdbc.password" value="foobar"/>
<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="javax.persistence.jdbc.user" value="koga"/>
</properties>
</persistence-unit>
</persistence>
貌似同樣的問題,但票的解決方案是從Eclipselink回滾到Toplink。有沒有人解決這個問題,而不回滾到toplink?
Unknown entity bean class after hot deploy: netbeans 6.9 + glassfish 2.1 + eclipselink jpa 2.0
UPDATE
至於我的研究去在這種情況下,你看像這個bug已經被解決,並定了嗎?
https://bugs.eclipse.org/bugs/show_bug.cgi?id=288141
我沒有足夠的知識來了解整個事情,但也有一些事實,我發現:
Netbean6.9.1提供的EclipseLink 2.0.1,而最新的版本是2.2.0
我下載了最新版本,並將它們放到lib目錄然後重新部署但沒有運氣,問題仍然存在。不知道我是否以錯誤的方式做事。後
UPDATE詹姆斯的評論
下面是我用它來創建單身的EntityManagerFactory類以及它是如何被使用。
package common;
import java.util.Date;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class EmProvider {
private static final String DB_PU = "kojoPU"; //工場DB
public static final boolean DEBUG = false;
private static final EmProvider singleton = new EmProvider();
private EntityManagerFactory emf;
private EmProvider() {}
public static EmProvider getInstance() {
return singleton;
}
public EntityManagerFactory getEntityManagerFactory() {
if(emf == null) {
emf = Persistence.createEntityManagerFactory(DB_PU);
}
if(DEBUG) {
System.out.println("factory created on: " + new Date());
}
return emf;
}
public void closeEmf() {
if(emf.isOpen() || emf != null) {
emf.close();
}
emf = null;
if(DEBUG) {
System.out.println("EMF closed at: " + new Date());
}
}
}//end class
如何使用它:
EntityManager em = null;
Object out = null;
try {
em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
Query query = em.createNativeQuery(sql);
....some code here
}
finally {
if(em != null) {
em.close();
}
}
通過看我的代碼,我想...... 我不打烊的EntityManagerFactory(我在關閉的EntityManager終於雖然)
我還發現主題中的"unknown entity bean class"
錯誤肯定會顯示以下操作。通過Netbean
部署Web應用程序(這將打開瀏覽器)
改變一些代碼Netbean IDE和保存。然後,只要按下保存按鈕,Netbean就會自動重新部署(這稱爲「熱部署」???)
回到瀏覽器並採取一些操作,如添加一些涉及EntityManager的數據。
看起來像是發生錯誤,因爲我沒有在熱部署時關閉實體管理器工廠?我必須進行調查。
但我不應該關閉EntityManagerFactory實例,因爲它是單例。我應該只關閉它,並在熱部署期間創建新的實例..?越來越困惑 – 2011-03-03 02:02:19