gpt4 book ai didi

java - Spring 框架集合被驱逐

转载 作者:行者123 更新时间:2023-12-04 08:34:11 25 4
gpt4 key购买 nike

我有这个错误:

2020-11-16 22:36:09.313 ERROR 19428 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: collection was evicted; nested exception is org.hibernate.HibernateException: collection was evicted] with root cause

org.hibernate.HibernateException: collection was evicted
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:43) ~[hibernate-core-5.4.22.Final.jar:5.4.22.Final]
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102) ~[hibernate-core-5.4.22.Final.jar:5.4.22.Final]
我创建了一个 API REST 应用程序,我的实体具有以下组成:
public class Label {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long Id;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "label")
private Set<Release> releases;
public class Release {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

@ManyToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
@JoinColumn(name = "label_id")
private Label label;


在创建发布/标签关联数据的第三个 API-REST 请求之后,我在顶部出现错误
休息 Controller :
    @PostMapping(value = "/release", consumes = "application/json", produces = "application/json")
Release newRelease(@RequestBody ReleaseDto releaseDto) {
return releaseService.addRelease(releaseDto);
}

发布服务:
@Service("ReleaseService")
public class ReleaseServiceImpl implements ReleaseService{

@Autowired
ReleaseRepository repository;
@Autowired
LabelRepository labelRepository;

@Override
public Release addRelease(ReleaseDto releaseDto) {
Release release = new Release();
Optional<Label> label = labelRepository.findById(releaseDto.getLabel_id());
if(label.isPresent()){
release.setName(releaseDto.getName());
release.setLabel(label.get());
repository.save(release);
}
return release;
}
我很困惑,也许我必须实现一个实体管理器?
你好。

最佳答案

作为第一个建议,我建议更改此行:

release = repository.save(release)
save 方法返回实体的更新对象,因此通过返回“非更新”对象,尝试序列化响应时可能会出现问题。
根据我们的讨论,可能会删除 CascadeType.ALL是这里的问题 - Hibernate 试图对不同步的相关实体做一些魔术。
也许您还想为响应创建一个 DTO,因为将它与实体分开是一种很好的做法。
使用 FetchType.EAGER 通常也不是一个好主意 - 关于此的一些说明 https://vladmihalcea.com/eager-fetching-is-a-code-smell/ .如果您更改此设置,您可能需要在服务中手动获取相关实体 - 更改为单独的 DTO,无论如何这都不是问题。
您可以查看 https://bootify.io ,您可以创建一个示例 REST API(但无论如何不能使用您的自定义端点)。

关于java - Spring 框架集合被驱逐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64879278/

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