레이지 초기화예외: 프록시를 초기화할 수 없음 - 세션 없음
사용합니다spring-data-jpa
와 함께spring-boot(v2.0.0.RELEASE)
방금 MySQL에 CRUD 데모를 작성했는데 런타임, 소스 코드에서 다음과 같은 예외가 발생합니다.
소스 코드
User.java
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Integer id;
private String username;
private String password;
...getter&setter
}
UserRepository.java
public interface UserRepository extends JpaRepository<User, Integer> {
}
UserServiceTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserRepository userRepository;
@Test
public void getUserById() throws Exception{
userRepository.getOne(1);
}
}
application.yml
spring:
datasource:
username: ***
password: ***
driver-class-name: com.mysql.jdbc.Driver
url: ********
thymeleaf:
cache: false
jpa:
show-sql: true
hibernate:
ddl-auto: update
예외내역
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:155)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:268)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73)
at cn.shuaijunlan.sdnsecuritysystem.domain.po.User_$$_jvstc90_0.getUsername(User_$$_jvstc90_0.java)
at cn.shuaijunlan.sdnsecuritysystem.service.UserServiceTest.getUserById(UserServiceTest.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
다른 방법을 시도해 봅니다.
userRepository.findOne(1)
성공적으로 실행될 수 있습니다.
추가할 수 있습니다.@Transactional
이 예외를 방지하기 위해 테스트 방법에 주석을 추가합니다.
방법getOne
속성이 느리게 로드될 수 있는 엔티티의 '참조'(접두사)를 반환합니다.코드 보기 - 사용getReference
의 방법EntityManager
it javadoc에서:
상태를 게으르게 가져올 수 있는 인스턴스를 가져옵니다.
봄에 의 시행.EntityManager
조직과 동기입니다.국내의SessionImppl - Session이 없으면 Spring이 이 메서드를 가져올 수 없습니다.
세션을 만들려면 트랜잭션을 생성하면 됩니다.
테스트는 다음과 같습니다.
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class QuestionTesting {
@Test
public void test() {
}
}
응용 프로그램 속성 spring.jpa.properties를 추가하기만 하면 됩니다.hibernate.enable_down_load_no_trans=true
서비스 클래스에서 주석 @PersistenceContext를 사용하여 엔티티 관리자에 대한 설정자를 추가하십시오.구체적으로 말하면,
@PersistenceContext(type = PersistenceContextType.EXTENDED)
이러한 방식으로 게으른 속성에 액세스할 수 있습니다.
언급URL : https://stackoverflow.com/questions/49894587/lazyinitializationexception-could-not-initialize-proxy-no-session
'programing' 카테고리의 다른 글
Vue.js 및 Vuex this.$store 반환을 새 Vue({store})에 추가한 후 정의되지 않음 (0) | 2023.07.01 |
---|---|
어떻게 "참조" 값을 소방서에 삽입합니까? (0) | 2023.07.01 |
파이썬의 Zip 목록 (0) | 2023.07.01 |
모의 서비스/구성요소를 사용한 스프링 부트 통합 테스트 (0) | 2023.07.01 |
Ajax 업데이트 후 jQuery에서 이벤트 다시 바인딩(업데이트 패널) (0) | 2023.07.01 |