복붙노트

[SPRING] 최대 절전 모드 (봄 ORM)와 봄 mvc 3의 적절한 사용

SPRING

최대 절전 모드 (봄 ORM)와 봄 mvc 3의 적절한 사용

나는 새로운 프로젝트를 시작하고, 이번에는 (이번에는 한 가지 이상의 질문에) 바로 할 생각이다. 도움이 필요할 수도있다. 내가 뭘 잘못하고 있는지 모르겠다.

Spring MVC를 가능한 한 많이 활용하고 싶습니다. @Transactional에서 세션 열기 / 닫기를 어떻게 처리합니까?

예외 (예 : 기존 레코드가 없거나 실패한 데이터베이스)가 있으면이를 어떻게 catch합니까? 즉 내 데이터베이스는 다음과 같은 중복 항목을 허용하지 않습니다.

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry

어떻게 나는 이것을 붙잡을 수 있습니까?

그리고 다음 요청 때마다이 예외가 생깁니다.

org.hibernate.AssertionFailure: null id in com.test.spring.ws.service.impl.TestObject entry (don't flush the Session after an exception occurs)

내가 뭘 잘못하고있어? 누구든지 내 프로젝트에서 몇 가지 개선점을 제안 할 수 있습니까?

해결법

  1. ==============================

    1.구성 요소 스캔

    구성 요소 스캔

    가장 먼저해야 할 일은 @Controller, @Service, @Repository 및 @Autowired를 사용하는 것이지만 아무 것도하지 않습니다. classpath 검색을 사용하는 것이 좋습니다. Spring 컨텍스트 파일에서 "testServiceDAO"및 "testService"빈을 제거하고 대신 다음을 사용하십시오.

    <context:component-scan base-package="com.test.spring.ws"/>
    

    그러면 XML로 선언 할 필요없이 주석으로 주석을 찾아서 만들 수 있습니다. @Autowired를 서비스의 testServiceDAO 필드와 DAO의 sessionFactory 필드에 추가하십시오. 이 필드의 설정자를 제거하십시오. 더 이상 필요하지 않습니다. 구성 요소 스캔 태그도 자동 와이어 링을 수행합니다. 컨텍스트 네임 스페이스를 사용하려면 루트 네임 스페이스에 추가해야합니다. 예 :

    <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:context="http://www.springframework.org/schema/context"
         xsi:schemaLocation="
             http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
             http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    

    트랜잭션 관리

    Sean이 말했듯이 @Transactional을 사용하려면 스프링 컨텍스트 파일에 요소를 추가해야합니다.

    <tx:annotation-driven/>
    

    트랜잭션 관리자 빈의 이름은 "transactionManager"이므로 자동으로 발견됩니다. 또한 "tx"네임 스페이스를 루트 요소에 추가해야하므로 다음과 같이 표시되어야합니다.

    <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:context="http://www.springframework.org/schema/context"
         xmlns:tx="http://www.springframework.org/schema/tx"
         xsi:schemaLocation="
             http://www.springframework.org/schema/beans 
             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
             http://www.springframework.org/schema/tx 
             http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
             http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    

    이 작업을 수행하려면 DAO 메소드에서 session.beginTransaction () 및 session.close ()를 모두 제거해야합니다. 이런 방식으로 자신의 트랜잭션을 여는 것은 프로그래밍 방식과 선언적 트랜잭션 구분 방식을 혼합하는 것이므로 선언 방식이 일반적으로 더 좋습니다. 또한 실제 프로젝트에서 DAO 세션을 절대로 닫지 않아야합니다. 그것은 모든 종류의 문제를 일으킬 것입니다.

    예외 처리

    MySQLIntegrityConstraintViolationException은 데이터베이스 특정 예외이므로 Hibernate에 의해 캐치되고 ConstraintViolationException으로 래핑됩니다. 이는 DAO에서 나오는 것입니다. 그러나 DAO는 @Repository이므로, Spring의 예외 변환의 이점을 누릴 수있다. 이것에 의해, Hibernate 예외는 Spring에 의해 캐치되어 DataIntegrityViolationException로 변환된다. 데이터베이스 예외 처리는 항상 재미 있습니다!

    세션 관리

    OpenSessionInViewFilter 또는 OpenSessionInViewInterceptor를 사용하고 있습니까? 그렇다면, Hibernate 세션은 요청이 처음 수신 될 때 열리고 응답이 작성된 후에 닫힙니다. 그렇지 않으면 세션은 트랜잭션이 시작될 때까지 (@Transactional 메서드에서) 시작되지 않으며 트랜잭션이 완료되면 닫힙니다. 필터 / 인터셉터를 사용하면 데이터베이스를 다시 호출해야하는 "보기"계층에서 작업을 수행 할 수 있습니다. 특히 릴레이션 관계가 있거나 뷰를 렌더링하는 데 필요한 지연된 객체가있는 경우에 유용합니다. 세션을 사용할 수 없다면 (트랜잭션 서비스 메서드의 길이에만 존재하는 것이 아니기 때문에) 뷰에서 이러한 세션을 수행 할 수 없으며 악의적 인 LazyInitializationException이 발생합니다.

    "예외 발생 후 세션을 플러시하지 마십시오."라는 오류에 대해서는 즉시 발생하지 않을 것으로 생각되는 항목이 없습니다. 아마 당신의 웹 티어 컨텍스트의 어떤 부분이 잘못 구성되었거나 DAO에서 직접 트랜잭션과 세션을 처리하는 방법에 이상한 상호 작용이있을 수 있습니다.

  2. ==============================

    2.스프링 컨텍스트에서 (및 tx 네임 스페이스)가 필요합니다.

    스프링 컨텍스트에서 (및 tx 네임 스페이스)가 필요합니다.

    (@Transactional 사용하기 참조)

  3. ==============================

    3.HibernateDaoSupport를 확장하고 DAO 코드에서 명시 적으로 SessionFactory를 사용하고 트랜잭션을 생성하는 대신 HibernateTemplate을 사용할 것을 제안합니다.

    HibernateDaoSupport를 확장하고 DAO 코드에서 명시 적으로 SessionFactory를 사용하고 트랜잭션을 생성하는 대신 HibernateTemplate을 사용할 것을 제안합니다.

  4. ==============================

    4.나는 봄철 @Transactional에서 멀리 떨어져서 멀리 머무를 것을 강력히 권고한다. 당신의 사용을 위해, 열린 세션 - 인 - 뷰 패턴을 고수하십시오. 요청이 들어 오면 세션이 열리고 트랜잭션이 시작됩니다. 예외 또는 기타 오류가 발생하면 트랜잭션을 롤백하십시오. 그렇지 않으면 커밋. 그런 식으로, Hibernate는 당신을 위해 모든 힘든 일을 처리합니다.

    나는 봄철 @Transactional에서 멀리 떨어져서 멀리 머무를 것을 강력히 권고한다. 당신의 사용을 위해, 열린 세션 - 인 - 뷰 패턴을 고수하십시오. 요청이 들어 오면 세션이 열리고 트랜잭션이 시작됩니다. 예외 또는 기타 오류가 발생하면 트랜잭션을 롤백하십시오. 그렇지 않으면 커밋. 그런 식으로, Hibernate는 당신을 위해 모든 힘든 일을 처리합니다.

    @Transactional의 경로를 따라 가면 어디에서 왔는지를 분류하려고 할 때 지연된 예외 및 다른 이상한 동작의 어두운 영역에 들어갑니다. 최악의 경우 적절한 권한이 있는지 확인하기 위해 메소드가 호출되는 순서 (예 : 스택에주의를 기울여야 함)를주의 깊게 추적해야합니다.

    최악의 경우, 만약 당신이 이미 Hibernate 1 차 또는 2 차 캐시에있는 것들에 @Transactional을두면, 실제 질의가 실행되지 않고 데이터베이스로가는 BEGIN / END 트랜잭션이 많이 발생하게된다. 캐시에서). 이것은 귀하의 실적을 죽일 수 있으며, 거의 털어 내기가 불가능합니다.

    세션의 트랜잭션이 터지면 롤백해야합니다. 세션의 의미에 따라 세션을 다시해야 할 수도 있습니다. 첫 번째 문제는 간단합니다. 먼저 저장 작업을 수행하기 전에 엔티티가 이미 존재하는지 확인하십시오. 그러면 두 번째 문제가 해결 될 것입니다.

    이 기사에서 Hibernate / JPA와 myBatis를 비교하여 좀 더 논평 해보십시오.

  5. from https://stackoverflow.com/questions/6709750/proper-usage-of-spring-mvc-3-with-hibernate-spring-orm by cc-by-sa and MIT license