mas*_*san 8 java rest jpa toplink eclipselink
我正在使用Netbean6.9.1和JPA EclipseLink构建REST Web应用程序.
我面临的问题是即使我的实体类MasatoTable标有Entity注释,我也会收到错误:
(java.lang.IllegalArgumentException: Unknown entity bean class:
class entity.MasatoTable, please verify that this class
has been marked with the @Entity annotation.)
Run Code Online (Sandbox Code Playgroud)
问题是当我从NetbeanIDE重新启动GlassFish3服务器时,它会工作一段时间,不知怎的,在某些时候,错误开始出现.我以前使用Toplink Essential并没有问题,但我已经改为EclipseLink并重新定义persistence.xml(如下所示)并且此问题已经开始.但我没有看到任何我能想到的代码错误..
MasatoTable.java
@Entity
@Table(name = "MasatoTable")
public class MasatoTable implements Serializable {
...continue code...
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
看起来像是同一个问题,但该票证的解决方案是从Eclipselink回滚到Toplink.有没有人解决这个问题而不回滚到toplink?
热部署后的未知实体bean类:netbeans 6.9 + glassfish 2.1 + eclipselink jpa 2.0
UPDATE
就我的研究而言,就这个案例而言,看起来已经解决并修复了错误?
https://bugs.eclipse.org/bugs/show_bug.cgi?id=288141
我不够了解整个事情,但我找到的事实很少:
Netbean6.9.1提供EclipseLink 2.0.1,而最新版本为2.2.0
我下载了最新版本并将它们放入lib目录然后重新部署但没有运气,问题仍然存在.不确定我是否以错误的方式做事.
詹姆斯发表评论后更新
下面是我用来创建单例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
Run Code Online (Sandbox Code Playgroud)
如何使用:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
通过查看我的代码,我认为...... 我没有关闭EntityManagerFactory(我终于关闭了EntityManager)
我也发现"unknown entity bean class"主题中的错误肯定会显示以下操作.
通过Netbean部署Web应用程序(这将打开浏览器)
在Netbean IDE中更改一些代码并保存.然后Netbean将在您按下保存按钮后自动重新部署(这称为"热部署"???)
返回浏览器并执行一些操作,例如添加一些涉及EntityManager的数据.
看起来错误发生是因为我在热部署时没有关闭实体经理工厂?我要调查一下.
您是如何创建EntityManager/Factory的,是管理还是非管理?
如果它没有被管理,那么我相信EclipseLink不会以任何方式通知重新部署,因此仍然会将旧的EntityManagerFactory缓存,因为它永远不会被关闭.您可以确保在热部署后关闭EntityManagerFactory吗?
您可以将持久性单元设置为托管持久性单元,以解决该问题.
无论哪种方式,请使用EclipseLink和Glassfish中的详细信息记录此错误,因为应该跟踪此问题.
我想这可能是错误,https://bugs.eclipse.org/bugs/show_bug.cgi?id = 326552
请投票支持此错误,并在其中包含您的信息.
| 归档时间: |
|
| 查看次数: |
14835 次 |
| 最近记录: |