gpt4 book ai didi

spring - Hibernate - 未能延迟初始化角色集合 - 无法初始化代理 - 无 session

转载 作者:行者123 更新时间:2023-12-01 15:34:05 26 4
gpt4 key购买 nike

问题:无法添加 Address通过 User 对象Spring 中的对象 Controller .

UserAddress类 -> @Entity

User有一个 List<Address>FetchType=LAZY

@Repository
public class UserDao{
@Autowired
private SessionFactory sessionFactory;
...
public User get(String username) {
Session session = sessionFactory.getCurrentSession();
return (User)session.get(User.class, username);
}
...
public void update(User user){
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(user);
}
...
}


@Service
@Transnational
public class UserService{
@AutoWired
private UserDao userDao;
...

@Transactional(readOnly = true)
public User get(String username) {
Session session = sessionFactory.getCurrentSession();
return (User)session.get(User.class, username);
}

public void update(User user){
userDao.update(user);
}
...
}

@Controller
public class UserController{
@AutoWired
private UserService userService;
....
public String update(){
User user = userService.get("user0001");
user.getAddressList.add(new Address("new street"));
return "update";
}
}

Spring.xml

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:jdbc.properties</value>
</property>
</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="packagesToScan" value="com.entity" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
</bean>

一切正常。但我无法更改 user @Controller 中的对象.

user对象在 @Controller 中发生变化level,没有这样的Hibernate session涉及对象。该对象不知何故不在 hibernate 上下文中。

错误发生在.add(new Address("new street")); @Controller 中的声明.

为什么禁止更改 Controller 中的对象这是通过 Hibernate session 接收的?

我遵循的方式不正确?如果不是,我做错了什么?

--Spring 4,Hibernate 4

最佳答案

User有一个 List<Address> .当您从数据库而不是列表中获取用户时,hibernate 会插入一个代理来处理地址的获取。

此代理需要有一个 session 才能执行任何操作。当您尝试添加地址时,您不在事务注释的范围内,因此没有会​​话。

让您继续前进的最佳方法是添加一个用 @Transactional 注释的方法在UserService添加一个地址。

关于spring - Hibernate - 未能延迟初始化角色集合 - 无法初始化代理 - 无 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28267786/

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