2010-02-17 41 views
5

Sử dụng jsf 1.2, hibernate, richfaces 3.3.0GA và facelets.Ngăn không cho cùng một đối tượng liên kết với hai phiên khác nhau trong hibernate

Tôi có mã này trong đậu ủng hộ tôi:

public List<Rater> getFreeRaters(){ 
    GP myGP = (GP) user; 
    update(myGP.getContract()); 
    ArrayList<Rater> raters = new ArrayList<Rater>(myGP.getContract().getRaters()); 
    ArrayList<Rater> selectedRaters = this.getSelectedRaters(); 
    raters.removeAll(selectedRaters); 
    return raters; 

} 

và mã này cho giao diện người dùng:

<a4j:form id="gradersForm" ajaxSingle="true"> 
    <rich:listShuttle sourceValue="#{user.gradersTab.freeRaters}" id="gradersTab_listShuttle" 
    targetValue="#{user.gradersTab.selectedRaters}" var="rater" listsHeight="150" 
     sourceListWidth="130" targetListWidth="130" sourceCaptionLabel="Available Items" 
     targetCaptionLabel="Currently Active Items" > 
     <rich:column> 
      <h:outputText value="#{rater.username}"></h:outputText> 
     </rich:column> 
    </rich:listShuttle>   
    <a4j:commandButton value="Save"></a4j:commandButton> 

</a4j:form> 

này được lọc phiên của tôi:

public class HibernateSessionRequestFilter implements Filter { 

private static Log log = LogFactory.getLog(HibernateSessionRequestFilter.class); 

private SessionFactory sf; 

public void doFilter(ServletRequest request, 
        ServletResponse response, 
        FilterChain chain) 
     throws IOException, ServletException { 
    HttpServletResponse resp= (HttpServletResponse) response; 
    try { 
     log.info("Starting a database transaction"); 
     Session session = sf.getCurrentSession(); 
     session.beginTransaction(); 

     // Call the next filter (continue request processing) 
     chain.doFilter(request, resp); 

     // Commit and cleanup 
     log.info("Committing the database transaction"); 

     session.getTransaction().commit(); 


    } catch (StaleObjectStateException staleEx) {... 

vấn đề này được đưa ra khi giao diện người dùng được hiển thị lại hai lần trở lên cùng một lúc thông qua AJAX. Là hai yêu cầu khác nhau, mỗi yêu cầu được một số Session và đối tượng được cố gắn vào cả hai cùng một lúc vì không có thời gian nào để kết thúc và làm session.close(), vì vậy hibernate ném ngoại lệ org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

Bất kỳ đề xuất nào để ngăn điều này xảy ra? Cảm ơn.

Cập nhật: web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" 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"> 
<display-name>eyeprevent</display-name> 
<context-param> 
<param-name>javax.faces.CONFIG_FILES</param-name> 
<param-value>/WEB-INF/faces-config.xml</param-value> 
</context-param> 
<context-param> 
<param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
<param-value>.xhtml</param-value> 
</context-param> 
<context-param> 
<param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
<param-value>server</param-value> 
</context-param> 
<context-param> 
<param-name>facelets.LIBRARIES</param-name> 
<param-value>/WEB-INF/functions.taglib.xml</param-value> 
</context-param> 
<context-param> 
<param-name>org.richfaces.SKIN</param-name> 
<param-value>#{user.skin}</param-value> 
</context-param> 
<context-param> 
<param-name>org.richfaces.CONTROL_SKINNING</param-name> 
<param-value>enable</param-value> 
</context-param> 
<filter> 
<filter-name>HibernateFilter</filter-name> 
<filter-class>com.eyeprevent.util.HibernateSessionRequestFilter</filter-class> 
</filter> 
<filter> 
<display-name>RichFaces Filter</display-name> 
<filter-name>richfaces</filter-name> 
<filter-class>org.ajax4jsf.Filter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>HibernateFilter</filter-name> 
<url-pattern>/pages/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
<filter-name>HibernateFilter</filter-name> 
<url-pattern>/upload/*</url-pattern> 
</filter-mapping> 

<filter-mapping> 

<filter-name>richfaces</filter-name> 
<servlet-name>Faces Servlet</servlet-name> 
<dispatcher>REQUEST</dispatcher> 
<dispatcher>FORWARD</dispatcher> 
<dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 
<listener> 
<listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 
<listener> 
<listener-class>com.eyeprevent.util.MySessionListener</listener-class> 
</listener> 
<servlet> 
<display-name>EPConnectServlet</display-name> 
<servlet-name>EPConnectServlet</servlet-name> 
<servlet-class>com.eyeprevent.servlets.EPConnectServlet</servlet-class> 
<init-param> 
<param-name>imagePath</param-name> 
<param-value>/home/pako/images</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet> 
<servlet-name>imageServlet</servlet-name> 
<servlet-class>com.eyeprevent.servlets.ImageServlet</servlet-class> 
<init-param> 
<param-name>imagePath</param-name> 
<param-value>/home/pako/images</param-value> 
</init-param> 
</servlet> 
<servlet> 
<servlet-name>Faces Servlet</servlet-name> 
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>EPConnectServlet</servlet-name> 
<url-pattern>/upload/EPConnectServlet</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
<servlet-name>imageServlet</servlet-name> 
<url-pattern>/image/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
<servlet-name>Faces Servlet</servlet-name> 
<url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 
<session-config> 
<session-timeout>0</session-timeout> 
</session-config> 
<welcome-file-list> 
<welcome-file>index.html</welcome-file> 
<welcome-file>index.xhtml</welcome-file> 
<welcome-file>index.htm</welcome-file> 
<welcome-file>index.jsp</welcome-file> 
<welcome-file>default.html</welcome-file> 
<welcome-file>default.htm</welcome-file> 
<welcome-file>default.jsp</welcome-file> 
<welcome-file>pages/login.xhtml</welcome-file> 
</welcome-file-list> 
<error-page> 
<error-code>404</error-code> 
<location>/pages/error.xhtml</location> 
</error-page> 
<error-page> 
<error-code>401</error-code> 
<location>/pages/unauthorized.xhtml</location> 
</error-page> 
<login-config> 
<auth-method>BASIC</auth-method> 
</login-config> 
</web-app> 
+0

là lựa chọn mùa xuân? – Bozho

+0

Không, nhưng tôi biết thời gian tới tôi sẽ xem xét nó, vì "Giữ phiên mở trong xem", mà chắc chắn là tiện dụng. – pakore

+0

tôi có thể thấy cấu hình servlet richfaces của bạn (từ web.xml) – Bozho

Trả lời

2

Rõ ràng sử dụng merge thay vì update xuất hiện để giải quyết vấn đề ...

Hãy nhớ rằng merge trả về cập nhật ví dụ mới, vì vậy bạn nên làm

myInstance = (myInstanceClass) Session.merge(myInstance); 
Các vấn đề liên quan