2009-07-30 4 views
4

저는 Spring에서 새롭기 때문에 Spring 3.0M3을 Mac의 Tomcat 서버에두고 Eclipse 프로젝트를 작성하고 Hello World를 작성한 다음 객체는 Hibernate와 지속된다. 내 MySQL 서버에서 User 테이블을 만들었고, 모든 getter와 setter를 가진 User 객체를 만들었다. (자바가 Objective-C에서 큐를 가져 와서 동적 속성을 추가하기를 바란다.) UserDao 객체를 검색하여 User를 저장하고 Bean을 구성합니다. 세션이 초기화되지 않는다는 것을 제외하고는 꽤 잘됩니다. 왜 이런거야? 이 컴퓨터에서이 자격 증명을 사용하여 데이터베이스에 액세스 할 수 있습니다.Hibernate/Spring3 : 프록시를 초기화 할 수 없음 - no Session

나는 이것들이 아마 정상적인 초보자 물건이라는 것을 알았지 만, 인터넷 검색이 최대 절전 모드 2에서 3으로 전환 할 때 중간에 세션을 잃어 버리고있는 사람들이었다고 나는 오류에서 발견했다. 나는 전환하지 않는다. , 그리고 내가 말할 수있는 한 세션은 결코 만들어지지 않는다. 여기

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url"  value="jdbc:mysql://10.0.0.3:3306/HelloDB" /> 
    <property name="username" value="hello" /> 
    <property name="password" value="w0rld" /> 
    <property name="initialSize" value="2" /> 
    <property name="maxActive" value="5" /> 
    </bean> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="annotatedClasses"> 
     <list> 
     <value>com.saers.data.entities.User</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     <prop key="hibernate.show_sql">true</prop> 
     <prop key="hibernate.lazy">false</prop> 
     </props> 
    </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

    <bean id="userDAO" class="com.saers.data.dao.UserDao"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

    <bean id="txProxyTemplate" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> 
    <property name="transactionManager" ref="transactionManager"/> 
    <property name="transactionAttributes"> 
     <props> 
     <prop key="add*">PROPAGATION_REQUIRED</prop> 
     <prop key="update*">PROPAGATION_REQUIRED</prop> 
     <prop key="delete*">PROPAGATION_REQUIRED</prop> 
     <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop> 
     </props> 
    </property> 
    </bean> 

    <bean id="userService" parent="txProxyTemplate"> 
    <property name="target"> 
     <bean class="com.saers.business.UserServiceImpl"> 
     <property name="userDao" ref="userDAO"/> 
     </bean> 
    </property> 
    <property name="proxyInterfaces" value="com.saers.business.UserService"/> 
    </bean> 

    <bean name="/" class="com.saers.view.web.controller.HelloWorldController"> 
    <property name="userService" ref="userService"/> 
    </bean> 

내 사용자 클래스 :

package com.saers.data.entities; 

import java.util.Date; 
import java.io.Serializable; 

import javax.persistence.*; 

@Entity 
@Table(name = "User") 
public class User implements Serializable { 

    private static final long serialVersionUID = -6123654414341191669L; 

    @Id 
    @Column(name = "WebUserId") 
    private String WebUserId; 

    @Column(name = "Name") 
    private String Name; 
    /** 
    * @return the webUserId 
    */ 
    public synchronized String getWebUserId() { 
     return WebUserId; 
    } 
    /** 
    * @param webUserId the webUserId to set 
    */ 
    public synchronized void setWebUserId(String webUserId) { 
     WebUserId = webUserId; 
    } 
    /** 
    * @return the name 
    */ 
    public synchronized String getName() { 
     return Name; 
    } 
    /** 
    * @param name the name to set 
    */ 
    public synchronized void setName(String name) { 
     Name = name; 
    } 
} 

그리고 여기 내 UserDao입니다 여기에

SEVERE: Servlet.service() for servlet HelloApp threw exception 
org.hibernate.LazyInitializationException: could not initialize proxy - no Session 
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57) 
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111) 
    at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150) 
    at com.saers.data.entities.User$$EnhancerByCGLIB$$c2f16afd.getName(<generated>) 
    at com.saers.view.web.controller.HelloWorldController.handleRequestInternal(HelloWorldController.java:22) 
    at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153) 
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:763) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:709) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:613) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:525) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) 
    at java.lang.Thread.run(Thread.java:637) 

는 관련 콩에 대한 내 서블릿 설정이다 : 여기

내 오류입니다 :

package com.saers.data.dao; 

import java.util.List; 

import com.saers.data.entities.User; 

import org.springframework.orm.hibernate3.support.*; 


public class UserDao extends HibernateDaoSupport { 

    public void saveUser(User user) { 
     getHibernateTemplate().saveOrUpdate(user); 
    } 

    public User lookupUser(String WebUserId) { 
     User user = getHibernateTemplate().load(User.class, WebUserId); 
     return user; 
     return user; 
    } 
} 

public class UserServiceImpl implements UserService { 

    private UserDao userDao; 
    public void setUserDao(UserDao userDao) { 
     this.userDao = userDao; 
    } 

    @Override 
    public User lookupUser(String webUserId) { 

     return userDao.lookupUser(webUserId); 
    } 
} 

그리고 마지막으로, 여기 내 HelloWorldController입니다 :

package com.saers.view.web.controller; 

import com.saers.data.entities.User; 
import com.saers.business.UserService; 

import org.springframework.web.servlet.mvc.*; 
import org.springframework.web.servlet.*; 
import javax.servlet.http.*; 
import org.apache.commons.logging.*; 



public class HelloWorldController extends AbstractController { 

    protected final Log logger = LogFactory.getLog(getClass()); 

    @Override 
    public ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 

    logger.info("Get bean"); 
    User user = userService.lookupUser("helloUser"); 
    logger.info("Found out that this user was last changed " + user.getName()); 
    logger.info("Return View"); 
    ModelAndView mv = new ModelAndView("HelloWorld.jsp", "user", user); 
    return mv; 
    } 

    private UserService userService = null; 
    public void setUserService(UserService userService) { 
     this.userService = userService; 
    } 

} 

난 당신이 내가 사용할 수있는 몇 가지 좋은 조언을 희망

여기 내 UserService 인터페이스

public interface UserService { 

    public User lookupUser(String webUserId); 
    public void setUserDao(UserDao userDao); 
} 

과 그 구현의 : -) 코드에서 코드가 잘못되었거나 스프링이 아닌 것으로 느껴지면 t에 대해 듣고 싶습니다. 모자도.

건배

Nik 
+0

업데이트 된 답변보기 – skaffman

답변

8

귀하의 스택 트레이스는 UserDao을 위해 게시 된 샘플 코드와 일치하지 않습니다. 흔적은 UserDao.lookupUser()에서 HibernateTemplate.initialize()을 호출하고 있지만 샘플 코드에는 아무 것도 수행하지 않는다고 표시되어 있습니다 (이 경우에도 initialize()을 호출해서는 안 됨).

편집 : OK, 새로운 스택 추적으로 문제가 단순히 hibernateTemplate.load()이라고 부르는 것 같습니다. 특정 상황에서만 사용해야하며 이는 그 중 하나가 아닙니다. 아마도 hibernateTemplate.get()으로 전화해야합니다.

+0

죄송합니다. 질문을 쓰는 동안 조금만 청소 해 보았습니다. 나를 다시 추락시키고 stacktrace를 업데이트하겠습니다 :-) – niklassaers

+0

Stacktrace updated :-) – niklassaers

+0

아하 !!! 고마워요 * VERY * 많이 !!!! 이 책 (꽤 추가 할만 큼), 190 페이지의 Actino에서 Spring은 명시 적으로로드()를 사용 했으므로 사용했습니다. 아마도 이것은 책이 쓰여진 이후로 변경되었습니다. .load()는 지금은 무엇을 의미합니까/.get()과 다른 점은 무엇입니까? 이제 모든 것이 훌륭하게 작동합니다. 매우 많이 고마워요 :-) – niklassaers

3

dao 호출을 수행하면 개체가로드됩니다. 로드가 데이터베이스에 도달하지 않으면 오브젝트에 프록시를 리턴하여 데이터베이스가 절대적으로 필요한 경우에만 히트합니다.

로드 전에 트랜잭션을 시작하지 않았습니다. 비 트랜잭션 읽기가 켜져 있기 때문에로드가 작동합니다 (기본적으로 켜져 있습니다). 그것은 미안하다, 거래를하지 않는다는 것을 말하지 않는다.

따라서 실제로 데이터베이스에 도달해야 할 때 getName을 수행하면 해당 객체를로드 한 세션이 닫혀서 (즉 즉시 닫혔습니다) "세션 없음"이라고 알립니다.

문제를 해결하려면 서블릿 호출 시작시 트랜잭션을 시작하고 끝에 끝내십시오. getName을 수행하면 세션을 계속 사용할 수 있습니다.

아마도 봄철에이 배관을 처리 할만한 것이있을 것입니다.

+0

그렇다면 비 트랜잭션 흐름을 사용할 수 없다는 말입니까? 둘째로, 나는 봄이 나를 위해 이것을 처리 할 것이라는 인상을 받았다. 결국 그것은 데이터 소스, sessionFactory 및 엔티티가 있습니까? 셋째, 게으른 페칭을 사용하지 않도록 설정 했으므로 프록시 객체를 생성해서는 안되며 프록시 객체도 채워야합니다. – niklassaers

+0

이제 트랜잭션에서 사용할 수 있고 트랜잭션 핸들러가 포함 된 서비스를 포함하도록 내 질문을 업데이트했습니다. 그러나, 나는 여전히 정확한 오류 : 세션 없음. 이 세션을 시작하려면 어떻게합니까? 그것을 거래에 넣는 것이 도움이되지 않았다. – niklassaers

관련 문제