[英]Hibernate - In a one-to-many relationship, a child loses references to the parent when updating
[英]hibernate one-to-many detach child object from parent relationship
我有两个具有一对多关系的实体film
(父母)和episode
(孩子),每当我创建具有episode
对象集合的film
对象时,一切正常,父对象和相关的子对象都会创建。 但是,当我尝试通过删除一堆“片段”对象来更新“电影”时,似乎没有任何效果
这是我要尝试做的,当我从film
删除一堆episode
对象时,那些删除的对象不应被删除, 而应保留为情节而未链接到任何父对象 。 这可能吗?
电影实体
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;
}
FilmEpisode实体
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;
}
在DAO中,我只是使用如下的saveOrUpdate
方法保存film
session.saveOrUpdate(film);
我在想什么吗?
orphanRemoval = true
从父实体中删除未引用的实体。 将其更改为orphanRemoval = false
,子实体将不会从数据库中删除。 您也可以删除它,因为它默认为false
:
在.NET中,我有同样的问题要排除孩子。 我决定从父级进行一次会话,然后在session中设置一个合并。
使用方法:
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时,我删除对象的行已从数据库中删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.