首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Framework集合已被逐出

Spring Framework集合已被逐出
EN

Stack Overflow用户
提问于 2020-11-18 00:28:04
回答 2查看 5.2K关注 0票数 4

我有这个错误:

代码语言:javascript
复制
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应用程序,我的实体有这样的组成:

代码语言:javascript
复制
public class Label {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long Id;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "label")
    private Set<Release> releases;
代码语言:javascript
复制
public class Release {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    
    @ManyToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinColumn(name = "label_id")
    private Label label;

在创建版本/标签关联数据的第三个API-REST请求之后,我在顶部出现了错误

RestController:

代码语言:javascript
复制
    @PostMapping(value = "/release", consumes = "application/json", produces = "application/json")
    Release newRelease(@RequestBody ReleaseDto releaseDto) {
        return releaseService.addRelease(releaseDto);
    }

ReleaseService:

代码语言:javascript
复制
@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;
    }

我很困惑,也许我必须实现一个实体管理器?

欢迎光临。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-18 01:07:32

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

代码语言:javascript
复制
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 (但无论如何都不能使用您的自定义端点)。

票数 2
EN

Stack Overflow用户

发布于 2021-06-27 19:06:21

代码语言:javascript
复制
@EqualsAndHashCode.Exclude
@ToString.Exclude

我为@onetomany对象添加了这两个注释,我的错误消失了。但我不知道该怎么做。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64879278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档