每当我创建一个集合为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
我错过了什么...... ??
答案 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,删除了该对象的行已从数据库中删除。