删除父行而不影响休眠中的子行

时间:2019-06-21 02:29:49

标签: mysql spring-mvc many-to-many hibernate-cascade

我在@Manytomany休眠关系中的代码有问题。

我看到上述问题是由于@ManyToMany关系方面的“ CascadeType.ALL”引起的。但是,如果我在@ManyToMany中删除此CascadeType.ALL。如果我使用CascadeType.PERSIST和CascadeType.MERGE在@ManyToMany中更改此CascadeType.ALL,则可以解决此问题。但是,当我添加新对象时,将得到一个错误。否则,如果我将其更改为CascadeType.ALL,则在添加新对象时可以正常使用,但不能解决我正在讨论的问题。因此,在删除Post中的行时如何将行保留在Class Tag中。

public class Post {

    @Id
    @GeneratedValue
    private Long id;

    private String title;

    public Post() {}

    public Post(String title) {
        this.title = title;
    }

    @ManyToMany(cascade = {
        CascadeType.ALL
    },fetch = FetchType.EAGER)
    @JoinTable(name = "post_tag",
        joinColumns = @JoinColumn(name = "post_id"),
        inverseJoinColumns = @JoinColumn(name = "tag_id")
    )
    private List<Tag> tags = new ArrayList<>();
}

//

public class Tag {

    @Id
    @GeneratedValue
    private Long id;

    @NaturalId
    private String nameTag;

    @ManyToMany(mappedBy = "tags",fetch = FetchType.LAZY)
    private List<Post> posts = new ArrayList<>();

    public Tag() {}

    public Tag(String nameTag) {
        this.nameTag = nameTag;
    }
}

正如我上面说的,如果它是CascadeType.ALL,则在删除Post中的行时,我将无法保留Tag中的行 当我写它是CascadeType.PERSIST和CascadeType.MERGE时,我得到一个错误: 对象引用了一个未保存的临时实例-在刷新之前保存该临时实例。

这是我的输入API对象:

{
    "title": "System",
    "tags": [
        {
            "nameTag": "apt"
        },
        {
            "nameTag":"Worm"
        }
    ]
}

请记住,当我使用Casecade.ALL时,api输入可以正常工作

0 个答案:

没有答案