【问题标题】:A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance when updating更新时拥有的实体实例不再引用具有 cascade="all-delete-orphan" 的集合
【发布时间】:2018-03-06 05:21:45
【问题描述】:

ProjectRequirement 实体之间存在一对多关系。

HTML:

<div class="container">
    <div class="row">
        <div class="col-sm-2"></div>
        <div class="col-sm-8">
            <form action="#" th:action="@{/projects/updateProject/(id=${project.id})}" method="post">
                <input hidden="hidden" name="id" th:value="${project.id}" />
                <div class="form-group">
                    <label>Project</label>
                    <input type="text" name="projectNaam" class="form-control" id="projectName" th:value="${project.projectName}" placeholder="Project"  />
                </div>
                <button type="submit" class="btn btn-default">Submit</button>
            </form>

        </div>
        <div class="col-sm-2"></div>
    </div>
</div>

这是我的控制器代码Project

@RequestMapping(value = "/updateProject", method = RequestMethod.POST)
public String updateProject @ModelAttribute("project") Project project){
    this.projectService.saveProject(project);

    return "redirect:/projects";
}

这是我的Project 课程:

@Entity
@Table(name = "Project")
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String projectName;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "project_id")
    private Set<Requirement> requirements;

    public Project(){

    }

    public Project(String projectName) {
        this.projectName = projectName;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getProjectName() {
        return projectName;
    }

    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }

    public Set<Requirement> getRequirements(){ return requirements; }

    public void setRequirements(Set<Requirement> requirements){ this.requirements = requirements; }

更新项目时出现错误(仅更新名称)。 已经在 Internet 上寻找解决方案,但没有找到适合我的解决方案。

【问题讨论】:

    标签: java spring hibernate jpa thymeleaf


    【解决方案1】:

    我会尝试以下一种或所有方法:

    • 您正在从事务上下文之外传递Project 对象。确保在保存之前将其合并。
    • 确保 Set 中的每个 Requirement 都引用了 Project 实体。
    • 确保合并后不要使用public void setRequirements(Set&lt;Requirement&gt; requirements)方法。
    • 当您使用Set 时。确保Requirement 已正确实现hashCodeequals

    【讨论】:

    • 感谢您的反馈!您的第一点:我应该将项目与其需求合并?您的第二点:我希望连接是单向的。我可以通过以下方式实现:在编辑时保存项目之前,检索项目的当前需求,将其添加到我从参数中获取的 Project 对象中?最后保存?
    • 是的,只要您检索需求并以相同的事务方法执行项目的保存/合并。
    猜你喜欢
    • 2012-03-14
    • 2011-08-01
    • 2021-01-09
    • 1970-01-01
    • 2016-11-26
    • 2023-03-17
    • 2018-10-08
    • 2020-05-28
    相关资源
    最近更新 更多