LazyInitializationException:无法初始化代理-没有会话 [英] LazyInitializationException: could not initialize proxy - no Session
问题描述
我在 spring-boot(v2.0.0.RELEASE)
中使用 spring-data-jpa
,我只是在MySQL上编写了一个CRUD演示,但在运行时,源代码如下:
I use spring-data-jpa
with spring-boot(v2.0.0.RELEASE)
, I just wrote a CRUD demo on MySQL, but an exception occurs during runtime, source code as follows:
源代码
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
批注以避免这种异常.
You can add @Transactional
annotation to your test method to avoid this exception.
方法 getOne
返回可以延迟加载属性的实体的引用"(代理).看到它
Method getOne
return the 'reference' (proxy) of the entity which properties can be lazy loaded. See it code - it uses getReference
method of EntityManager
. From it javadoc:
获取一个实例,其状态可能会延迟获取.
Get an instance, whose state may be lazily fetched.
In Spring the implementation of EntityManager
is org.hibernate.internal.SessionImpl - so without the Session the Spring can not get this method.
要进行会话,您只需创建交易...
To have a session you can just create a transaction...
这篇关于LazyInitializationException:无法初始化代理-没有会话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!