问题:无法通过Spring控制器在
一切正常。但是我无法在
User
对象中添加Address
对象。
User
和Address
类均为@Entity
。
User
具有带有FetchType=LAZY
的List<Address>
。@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>
一切正常。但是我无法在
@Controller
内部更改user
对象。当user
对象在@Controller
级别中被更改时,没有Hibernate会话与该对象相关联。不知何故,该对象已经超出了Hibernate上下文。错误发生在@Controller
中的.add(new Address("new street"));
语句处。为什么禁止在通过Hibernate会话接收到的Controller
内更改对象?我所遵循的方式是不正确的吗?如果不是,我做错了什么?--Spring 4,Hibernate 4
@Transactional
关键字的魔力所隐藏。 - M.P. Korstanje@Transactional
的方法进入用户服务,直到你通过bean离开,所有操作都将在事务内部进行。调用另一个方法也会将其放入事务范围内。但是,如果你通过一个没有注释的方法进入UserService,然后尝试使用一个有注释的方法,你将没有会话。 - M.P. KorstanjeSpring JDBC
、Hibernate
等来获取实体。但为什么Controller
需要了解这个懒加载和代理。对于Controller
来说,它只是一个对象。你能给我指一些关于“TLDR:规则是:不要在事务外更改数据”的来源吗? - user2172625