从父关系中休眠一对多分离子对象

时间:2015-08-28 10:52:21

标签: java spring entity-framework hibernate relationship

每当我创建一个集合为film的{​​{1}}对象时,我有2个实体episode(父级)和film(子级),具有一对多的关系对象,一切正常,父和相关的子对象被创建。但是,当我试图通过删除一堆“插曲”对象来更新“电影”时似乎没有任何结果

在这里我要做的是,当我从episode中删除一堆episode个对象时,不应删除那些已删除的对象,而是保留为剧集而不链接到任何父对象即可。这可能吗?

电影实体

film

FilmEpisode 实体

    import org.hibernate.annotations.*;

    import javax.persistence.*;
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.Table;
    import java.util.Set;

    @Entity
    @Table(name = "FILM")
    @Getter
    @Setter
    public class Film {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;

        @Column(name = "ORIGINAL_TITLE", nullable = false)
        private String originalTitle;


        @OneToMany(targetEntity=FilmEpisode.class, mappedBy="film", cascade=CascadeType.ALL,fetch=FetchType.EAGER, orphanRemoval = true)
        private Set<FilmEpisode> filmEpisodes;

        @Column(name = "SHOW_ON_LANDING_PAGE")
        private Boolean showOnLandingPage;
    }

在DAO中,我只是使用 import javax.persistence.*; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.Table; import java.util.Set; @Entity @Table(name = "FILM_EPISODE") @Getter @Setter public class FilmEpisode { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(name = "ORIGINAL_TITLE", nullable = false) private String originalTitle; @ManyToOne @JoinColumn(name = "FILM_ID") private Film film; } 方法保存film,如下所示

saveOrUpdate

我错过了什么...... ??

2 个答案:

答案 0 :(得分:1)

orphanRemoval = true正在删除父实体中未引用的实体。 将其更改为orphanRemoval = false,不会从数据库中删除子实体。您也可以将其删除,因为它默认为false

答案 1 :(得分:0)

在.NET中,我遇到了排除孩子的同样问题。 我决定从父进行会话,然后在会话中设置合并。

使用:

Map Parent

HasMany(x => x.Child) .KeyColumn("id") .AllDeleteOrphan();

更新方法:

public void Update(Parent model)
{
   var session = _sessionFactory.GetCurrentSession();

   using (var transaction = session.BeginTransaction())
   {
       session.Load<Parent>(model.Id);
       session.Merge(model);
       transaction.Commit();
   }
}

要在数据库中加载.load中的列表,返回三行,并且方法中的最后一个对象只有2行。制作.Commit,删除了该对象的行已从数据库中删除。