java - 如何修复 LazyInitializationException - Spring 应用程序中没有会话?
问题描述
在 Spring 应用程序中,有时我会遇到异常:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role ... could not initialize proxy - no Session
在client.getCatIdSet
. 我无法测试是否fetch = FetchType.EAGER
修复问题,因为此错误不会经常发生。类有Transactional
注解,方法是公开的。我该如何解决这个异常?
@Service
@Transactional
public class ChatService {
@PersistenceContext
EntityManager entityManager;
public BotRequest getBotRequest(MessageData messageData) {
Client client = messageData.getMessage().getClient();
Optional<CatId> mbCatId = Optional.ofNullable(client.getCatIdSet())
.orElse(Collections.emptySet())
.filter
...
此方法调用自:
@Service
public class SendMsgToCatBotService extends SendMsgToBotService {
@Override
protected BotRequest createBotRequest(MessageData messageData) {
return chatService.getBotRequest(messageData);
}
客户实体:
@Entity
@Table(name = "clients")
public class Client implements Serializable {
private int id;
private Set<CatId> catIdSet;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "clients_generation")
@SequenceGenerator(name = "clients_generation", sequenceName = "clients_id_seq", allocationSize = 1)
@Column(name = "id")
public int getId() {
return id;
}
@OneToMany(mappedBy = "client")
public Set<CatId> getCatIdSet() {
return catIdSet;
}
解决方案
在您的 web.xml 中,添加以下过滤器。
<filter>
<filter-name>SpringOpenEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SpringOpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
推荐阅读
- scala - Slick:刚获取时更新不可用
- ios - Swift - 从 Facebook 登录中获取错误
- json - json文件更改时我有json文件我需要在python控制台中显示更改
- javascript - 打印清单
- pandoc - 从 docx 转换为 markdown 如何摆脱链接中的跨度下划线?
- node.js - 如何通过sequelize在where语句中使用db函数
- tableview - 如何在颤振中实现这样的表格视图?
- c# - 无法使用字符串值更新 JSON 节点
- java - Jersey 客户端无法反序列化为对象
- php - PHP - 在文本文件中搜索字符串并将整行转换为数组