gpt4 book ai didi

mysql - LazyInitializationException 试图获取惰性初始化实例

转载 作者:可可西里 更新时间:2023-11-01 07:24:45 24 4
gpt4 key购买 nike

当我尝试获取惰性初始化实体时,我在我的 IDE 中看到以下异常消息(我无法找到它在代理实体中的存储位置,因此我无法提供此异常的整个堆栈跟踪):

Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate com.epam.spring.core.domain.UserAccount_$$_jvste6b_4.toString()

这是我在尝试访问我想使用的惰性初始化实体的字段后得到的堆栈跟踪:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)

at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)

at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)

at com.epam.spring.core.domain.UserAccount_$$_jvstfc9_4.getMoney(UserAccount_$$_jvstfc9_4.java)

at com.epam.spring.core.web.rest.controller.BookingController.refill(BookingController.java:128)

我正在使用 Spring Data,已配置 JpaTransactionManager,数据库是 MySql,ORM 提供程序是 Hibernate 4。注解 @EnableTransactionManagement 已打开,@Transactional 被放在我能想象到的任何地方,但没有任何效果。

这是一个关系:

@Entity
public class User extends DomainObject implements Serializable {

..

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "user_fk")
private UserAccount userAccount;

..

@Entity
public class UserAccount extends DomainObject {

..

@OneToOne(mappedBy = "userAccount")
private User user;

..

.. 一段配置:

    @Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getRequiredProperty(PROP_NAME_DATABASE_DRIVER));
dataSource.setUrl(env.getRequiredProperty(PROP_NAME_DATABASE_URL));
dataSource.setUsername(env.getRequiredProperty(PROP_NAME_DATABASE_USERNAME));
dataSource.setPassword(env.getRequiredProperty(PROP_NAME_DATABASE_PASSWORD));
return dataSource;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROP_ENTITYMANAGER_PACKAGES_TO_SCAN));
entityManagerFactoryBean.setJpaProperties(getHibernateProperties());
return entityManagerFactoryBean;
}

@Bean
public JpaTransactionManager transactionManager(@Autowired DataSource dataSource,
@Autowired EntityManagerFactory entityManagerFactory) {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
jpaTransactionManager.setDataSource(dataSource);

return jpaTransactionManager;
}

.. 这就是我想要检索 UserAccount 的方式:

    @RequestMapping(...)
@Transactional()
public void refill(@RequestParam Long userId, @RequestParam Long amount) {
User user = userService.getById(userId);
UserAccount userAccount = user.getUserAccount();
userAccount.setMoney(userAccount.getMoney() + amount);
}

Hibernate 版本是 4.3.8.Final,Spring Data 1.3.4.RELEASE 和 MySql connector 5.1.29。

请问我是否还需要其他东西。提前致谢!

最佳答案

首先,你要明白,问题的根源不在于事务。我们有一个事务和一个持久上下文( session )。使用 @Transactional 注释,Spring 创建一个事务并打开持久上下文。调用方法后,持久上下文将关闭。

当您调用 user.getUserAccount() 时,您有一个包装 UserAccount 的代理类(如果您不加载 UserAccount 用户)。因此,当持久性上下文关闭时,在调用 UserAccount 的任何方法期间都会出现 LazyInitializationException,例如 user.getUserAccount().toString().

@Transactional 仅在 userService 级别上工作,在您的情况下。要使 @Transactional 正常工作,仅将 @Transactional 注释放在方法上是不够的。您需要使用 Spring Context 中的方法获取类的对象。因此,要更新资金,您可以使用另一种服务方法,例如 updateMoney(userId, amount)

如果您想在 Controller 方法上使用@Transactional,您需要从Spring Context 获取 Controller 。 Spring 应该明白,它应该用一个特殊的方法包装每个 @Transactional 方法来打开和关闭持久上下文。另一种方法是使用 Session Per Request Anti 模式。您将需要添加一个特殊的 HTTP 过滤器。

https://vladmihalcea.com/the-open-session-in-view-anti-pattern/

关于mysql - LazyInitializationException 试图获取惰性初始化实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42632648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com