Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring框架集合已被逐出_Java_Spring_Hibernate - Fatal编程技术网

Java Spring框架集合已被逐出

Java Spring框架集合已被逐出,java,spring,hibernate,Java,Spring,Hibernate,我有一个错误: 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

我有一个错误:

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;
在创建发布/标签关联数据的第三个API-REST请求之后,我在顶部出现了错误

RestController:

    @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;
    }
@Service(“发布服务”)
公共类ReleaseServiceImpl实现ReleaseService{
@自动连线
释放存储库;
@自动连线
LabelRepository LabelRepository;
@凌驾
公开发布addRelease(ReleaseDto ReleaseDto){
发布=新发布();
可选label=labelRepository.findById(releaseDto.getLabel_id());
if(label.isPresent()){
release.setName(releaseDto.getName());
release.setLabel(label.get());
保存(发布);
}
返回释放;
}
我很困惑也许我必须实施实体管理器


问候。

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

release = repository.save(release)
save方法返回实体的更新对象,因此通过返回“未更新”对象,在尝试序列化响应时可能会出现问题

在我们的讨论之后,可能删除了
CascadeType。这里的问题是所有的
——Hibernate试图对不同步的相关实体施展魔法

也许您还想为响应创建一个DTO,因为将其与实体分离是一种良好的做法

使用FetchType.EAGER通常也不是一个好主意-对此有一些注意事项。如果您更改此选项,可能需要在服务中手动获取相关实体-更改为单独的DTO,这无论如何都不是问题


您可以签出,您可以创建一个示例RESTAPI(但无论如何不能使用自定义端点).

你也可以添加你的addRelease方法吗?到目前为止,它看起来还不错。@Thomas我使用并在releaseDto中使用了
@Data notation
我指的是实现addRelease的服务。也许你在配置hibernate时也有一些不寻常的设置?@Thomas我在Spring的时候比较年轻,在我的应用程序中,我在我的应用程序中有这个。属性
Spring.jpa.database platform=org.hibernate.dialen.mysql5innodbdialen spring.jpa.hibernate.ddl auto=update§spring.datasource.url=jdbc:mysql://IPXX:3306/DB  spring.datasource.username=(username)spring.datasource.password=(password)
@Thomas我确实在服务的顶部进行了更新。哟!我试图更改这些行,但没有成功:(我保存了你的项目,我会研究它。我不知道我错在哪里。我也不确定-你现在可以从服务/控制器中删除响应,看看错误是否仍然存在。我删除控制器的响应,错误仍然存在。另一个想法:尝试删除级联类型。全部-可能Hibernate内部尝试用过期的发布集更新标签。我删除了CascadeType.ALL,我用LAZY更改了所有EAGER,它成功了!谢谢Thomas!现在仔细阅读,之后我想阅读你的项目。谢谢!
release = repository.save(release)