2010-12-07 3 views
3

Когда я развертываю свое приложение, он отлично работает, пока я не сделаю изменения, save и netbeans hot разворачивает приложение. На этом этапе я получаю неизвестную ошибку класса объектов bean класса, у которого есть @entity, и он включен в мой persistence.xml. Когда это происходит, все, что работает с jpa, перестает работать. Только если я перезапущу сервер, мои вещи jpa начнут работать снова.Неизвестный объект bean class после горячего развертывания: netbeans 6.9 + glassfish 2.1 + eclipselink jpa 2.0

Если я вернусь к разворачиванию при сохранении в моем проекте, и я только вручную сохраняю и развертываю, я получаю те же результаты.

Это просто ошибка netbeans/glassfish? Или что-то не так с моей настройкой jpa?

Исключение

java.lang.IllegalArgumentException: Unknown entity bean class: class amc.nase.idms.persistence.model.SecSession, please verify that this class has been marked with the @Entity annotation. 
     at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:592) 
     at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:476) 
     at amc.nase.idms.persistence.controllers.SecSessionJpaController.findSecSession(SecSessionJpaController.java:134) 
     at amc.nase.idms.services.SecurityServiceHelper.validateSession(SecurityServiceHelper.java:106) 
     at amc.nase.idms.services.SecurityService.validateSession(SecurityService.java:78) 
     at amc.nase.idms.web.extensions.SecurityInterceptor.intercept(SecurityInterceptor.java:64) 
     at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155) 
     at net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113) 

Сущность

import java.io.Serializable; 

import java.util.Date; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 


@Entity 
@Table(name = "SEC_SESSION",schema = "APPLOCK") 
@NamedQueries({ 
    @NamedQuery(name = "SecSession.findAll", query = "SELECT s FROM SecSession s"), 
    @NamedQuery(name = "SecSession.findBySessionid", query = "SELECT s FROM SecSession s WHERE s.sessionid = :sessionid"), 
    @NamedQuery(name = "SecSession.findByOrgid", query = "SELECT s FROM SecSession s WHERE s.orgid = :orgid"), 
    @NamedQuery(name = "SecSession.findByConnecttime", query = "SELECT s FROM SecSession s WHERE s.connecttime = :connecttime"), 
    @NamedQuery(name = "SecSession.findByConnectip", query = "SELECT s FROM SecSession s WHERE s.connectip = :connectip")}) 
public class SecSession implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id  
    @Column(name = "SESSIONID") 
    private String sessionid; 
    @Basic(optional = false) 
    @Column(name = "ORGID") 
    private Integer orgid; 
    @Basic(optional = false) 
    @Column(name = "CONNECTTIME") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date connecttime; 
    @Basic(optional = false) 
    @Column(name = "CONNECTIP") 
    private String connectip; 

    public SecSession() { 
    } 

    public SecSession(String sessionid) { 
     this.sessionid = sessionid; 
    } 

    public SecSession(String sessionid, Integer orgid, Date connecttime, String connectip) { 
     this.sessionid = sessionid; 
     this.orgid = orgid; 
     this.connecttime = connecttime; 
     this.connectip = connectip; 
    } 

    public String getSessionid() { 
     return sessionid; 
    } 

    public void setSessionid(String sessionid) { 
     this.sessionid = sessionid; 
    } 

    public Integer getOrgid() { 
     return orgid; 
    } 

    public void setOrgid(Integer orgid) { 
     this.orgid = orgid; 
    } 

    public Date getConnecttime() { 
     return connecttime; 
    } 

    public void setConnecttime(Date connecttime) { 
     this.connecttime = connecttime; 
    } 

    public String getConnectip() { 
     return connectip; 
    } 

    public void setConnectip(String connectip) { 
     this.connectip = connectip; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (sessionid != null ? sessionid.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     if (!(object instanceof SecSession)) { 
      return false; 
     } 
     SecSession other = (SecSession) object; 
     if ((this.sessionid == null && other.sessionid != null) || (this.sessionid != null && !this.sessionid.equals(other.sessionid))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "gov.faa.nase.security.persistence.SecSession[sessionid=" + sessionid + "]"; 
    } 
    public SecSessionTO transfer(){ 
     SecSessionTO to = new SecSessionTO(); 
     to.setConnectIP(connectip); 
     to.setConnectTime(connecttime); 
     to.setOrgId(orgid); 
     to.setSessionId(sessionid); 
     return to; 
    } 
} 

Постоянство XML

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.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_1_0.xsd"> 
    <persistence-unit name="iDMSPU" transaction-type="JTA"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>jdbc/dms</jta-data-source> 
    <class>amc.nase.idms.persistence.model.Org</class> 
    <class>amc.nase.idms.persistence.model.SecApp</class> 
    <class>amc.nase.idms.persistence.model.SecPermission</class> 
    <class>amc.nase.idms.persistence.model.SecRole</class> 
    <class>amc.nase.idms.persistence.model.SecSession</class> 
    <class>amc.nase.idms.persistence.model.SecUserRole</class> 
    <class>amc.nase.idms.persistence.model.TurAccessCodes</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties/> 
    </persistence-unit> 
</persistence> 

ОБНОВЛЕНИЕ

Web XML

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
<context-param> 
    <param-name>IOCInjector.PACKAGE</param-name> 
    <param-value>amc.nase.idms.services</param-value> 
</context-param> 
<listener> 
    <listener-class>amc.nase.idms.web.IOCInitializer</listener-class> 
</listener> 
<filter> 
    <display-name>Stripes Filter</display-name> 
    <filter-name>StripesFilter</filter-name> 
    <filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class> 
    <init-param> 
     <param-name>ActionResolver.Packages</param-name> 
     <param-value>amc.nase.idms.web.actions</param-value> 
    </init-param> 
    <init-param> 
     <param-name>Extension.Packages</param-name> 
     <param-value>amc.nase.idms.web.extensions</param-value> 
    </init-param> 
    <init-param> 
     <param-name>Configuration.Class</param-name> 
     <param-value>amc.nase.idms.web.extensions.IOCRuntimeConfiguration</param-value> 
    </init-param> 
    <init-param> 
     <param-name>ActionBeanContextFactory.Class</param-name> 
     <param-value>amc.nase.idms.web.extensions.IDMSActionBeanContextFactory</param-value> 
    </init-param> 
    <init-param> 
     <param-name>ActionResolver.Class</param-name> 
     <param-value>amc.nase.idms.web.extensions.IDMSActionResolver</param-value> 
    </init-param> 
</filter> 
<filter> 
    <description>Dynamically maps URLs to ActionBeans.</description> 
    <display-name>Stripes Dynamic Mapping Filter</display-name> 
    <filter-name>DynamicMappingFilter</filter-name> 
    <filter-class>net.sourceforge.stripes.controller.DynamicMappingFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>StripesFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>DynamicMappingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 
<session-config> 
    <session-timeout> 
     30 
    </session-timeout> 
</session-config> 
<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 
<resource-ref> 
    <res-ref-name>jdbc/dms</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 
<resource-ref> 
    <res-ref-name>jdbc/harv</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 
</web-app> 
+0

кажется, хорошо для меня. Удостоверьтесь, что у вас есть очищенная сборка и окружающая среда. – Bozho

+0

У меня это, похоже, не помогает, только после того, как я остановлюсь и запустил сервер, это сработает. Для меня просто странно, что приложение перестанет работать из-за неизвестного класса bean-класса, когда до развертывания он нашел его в порядке. – joekarl

+0

По-видимому, по какой-то причине при повторном развертывании возникает ошибка, если eclipselink не имеет успешного выхода из системы. если я повторно запустил приложение пару раз, он, в конечном счете, получит успешный выход из системы, а затем повторное развертывание будет работать. Есть идеи? – joekarl

ответ

2

Проблема заключается в том, что старая единица сохранения со ссылками на старые классы остается после вашего повторного развертывания. Убедитесь, что старый EntityManagerFactory закрыт. Glassfish должен обрабатывать это для любых управляемых фабрик, например, в SessionBean, но если вы управляете своими заводами, вам необходимо обеспечить их закрытие.

+0

Я думаю, это была проблема. С тех пор мы перешли на 3-е и 3-е место, и это перестало быть проблемой. – joekarl

1

Ваша проблема довольно интересна. Итак, я просто продолжаю читать об этом больше. Я нашел поток в самой SO, который до сих пор не имеет никакого решения JPA - Unknown entity bean class. Не только в SO, а также некоторые форумы снаружи, как:

Через некоторое время я нашел еще один поток на SO сам "Java Persistance Issue"

Запрашивается & Отправлено James:

Так как вышеприведенные комментарии указывают на то, что , похоже, проблема с затмением вставка для стеклянной рыбы. У меня нет проблем при развертывании уха вручную.

Спасибо всем за помощь.

Джеймс

Наконец, это звучит как вопрос :) http://java.net/jira/browse/GLASSFISHPLUGINS-307

Надежда, Джеймс сообщение поможет.

+1

На самом деле, теперь я вижу проблемы, если я перекладываю на стеклянную рыбку вручную, поэтому она не может быть проблемой netbeans. Похоже, что следует следовать шаблону, что если сеанс jpa не выйдет из строя должным образом (может видеть с журналом eclipselink), тогда приложение не запустит новый сеанс jpa, который вызывает неизвестные исключения сущностей. К сожалению, я не могу заставить приложение выйти из сессии jpa при завершении работы (я думаю, что Glassfish позаботится об этом). Все еще не могу думать о том, что может вызвать это. – joekarl

+0

Очень интересно, я использую Netbean6.9.1 с GlassFish v3 и EclipseLink и имея точно такую ​​же проблему. Я только что переключился с toplink на eclipselink, и эта проблема началась ... –

0

Оказывается, мы не нуждались ни в каких функциях JPA 2.0 в это время, а поддержка eclipselink для Glassfish v2 немного пятнистая. Таким образом, решение для нас состояло в том, чтобы вернуться к toplink и JPA 1.0. Не лучшее решение, но оно решило проблемы с развертыванием. Мы посмотрим на eclipselink, когда перейдем к стеклянному стеклу v3.

1

Хотя это не очевидно из опубликованного кода, если это решение, но симптомы одинаковы.

Возможно, это происходит при создании диспетчера сущностей из фабрики управления сущностями за пределами контейнера. Завод должен быть закрыт при разворачивании. Вот почему он работает только в первый раз при развертывании, а не при повторном развертывании. См.: Unknown entity bean class issue with glassfish v3

0

У меня также возникла эта проблема в веб-службе, которая извлекает данные из базы данных. Я выбрал два решения: - (1) Решение было положить метод в WebService как @PreDestroy общественная пустота разрушится() ==> Здесь я закрыт EntityManagerFactory (2) Введен слушателя контекста сервлета и закрыл открытую э.д.с. здесь также в случае, если метод webservice не может работать по какой-либо причине.

Поскольку перезагрузка сервера для повторного развертывания неприемлема, я хотел быть на более безопасной стороне, дважды закрывая emf, если он остается открытым, у него есть шанс закрыться в прослушивателе.

Thanks Нитин