2

스프링 데이터가있는 나머지 백엔드 시스템에 스프링 부트를 사용하고 있습니다. 세 가지 주요 계층 (컨트롤러, 서비스, DAO)이 있습니다.스프링 부트 및 트랜잭션 경계

서비스 클래스에 @Transactional 주석을 달고 그 중 하나에서 다른 Entity와 @ManyToMany 관계를 갖는 일부 엔터티를 검색 중입니다.

나는 오직 주체를 얻고 싶다. 나는 @ManyToMany의 게으른 것에 달려있다.

문제는 SQL 문이 문제가되어 트랜잭션이 여전히 실행중인 것처럼 콜렉션을 검색 할 때 컨트롤러에서 서비스로 돌아온 후입니다.

@SpringBootApplication 
@ComponentScan(value = { "net.pd.ethraa" }) 
@EnableJpaRepositories(basePackages = { "net.pd.ethraa.dao" }) 
@EntityScan(basePackages = "net.pd.ethraa.common.model") 
@EnableTransactionManagement 
public class EthraaApplication extends SpringBootServletInitializer { 
} 

@RequestMapping(path = "/get/{id}", method = RequestMethod.GET) 
    public Account getAccount(@PathVariable("id") Long id) { 
    Account account = accountService.find(id); 

    for (Permission p : account.getPermissions()) { 
     System.out.println(p.getName()); 
    } 
    return account; 

    } 


@Service 
@Transactional 
public class AccountServiceImpl implements AccountService { 

@Override 
    public Account find(Long id) { 
    return accountDao.findOne(id); 

    } 
} 

@Repository 
public interface AccountDao extends CrudRepository<Account, Long> {} 


@Entity 
@Table(name = "ACCOUNT", uniqueConstraints = @UniqueConstraint(columnNames = { "mobile", "email" })) 
public class Account extends BaseEntity { 
@ManyToMany 
    @JoinTable(name = "ACCOUNT_PERMISSION") 
    private List<Permission> permissions; 
} 

내 기대는 내가 트랜잭션 경계 외부에 있어야 서비스 외부 컬렉션을 쳤을 때하고 게으른 예외를 제공하지만, 그렇지 않습니다?

답변

3

스프링 부트는 기본적으로이 동작을 허용하는 OpenEntityManagerInViewInterceptor을 활성화합니다.

당신은 응용 프로그램 설정 파일에 다음과 같은 속성을 사용하여 해제 할 수 있습니다 :

spring.jpa.open-in-view=false 
+0

이 모든 시나리오에 대한 사실인가요? 스프링 부트가 일부 애플리케이션 속성/주석/클래스를 통해 이것을 켜는가? 안내해주십시오. 나는 스프링 부트 1.4.2의 최신 버전에서 예제를 시도했다. 내가 게으른로드 예외가있어. – Barath

+0

이 옵션은 현재 스프링 부트 버전에서 'true'로 기본 설정되어야합니다. 이 인터셉터의 등록 조건은 [소스 코드] (https://github.com/spring-projects/spring-boot/blob/v1.4.3.RELEASE/spring-boot-autoconfigure/src/main)에서 확인할 수 있습니다. /java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java#L185). 문제가있는 경우 예제와 함께 별도의 질문을 시작하십시오. –