Hibernate: bi-directional one-to-many with one as parent

weekens picture weekens · Jul 9, 2011 · Viewed 9.1k times · Source

I'm trying to setup a bi-directional one-to-many relationship with "one" as parent

I have a parent:

@Entity
public class VideoOnDemand {

   @OneToMany(cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.FALSE)
   @JoinColumn(name = "video_id")
   private List<CuePoint> cuePoints = new ArrayList<CuePoint>();
}

and a child:

@Entity
public class CuePoint {

   @ManyToOne(cascade=CascadeType.ALL)
   @JoinColumn(name = "video_id", insertable = false, updatable = false)
   private VideoOnDemand video;
}

I used recommendations from the official Hibernate documentation (2.2.5.3.1.1). However, Hibernate doesn't seem to understand that CuePoint is a child entity, so, when I delete the CuePoint, it deletes VideoOnDemand as well with all the other CuePoints.

What am I doing wrong and what is the right way?

Answer

JB Nizet picture JB Nizet · Jul 9, 2011

By doing that, you'be mapped a unique bidirectional association as two unidirectional associations. One of the side must be marked as the inverse of the other:

@Entity
public class VideoOnDemand {

   @OneToMany(mappedBy = "video", cascade = CascadeType.ALL)
   private List<CuePoint> cuePoints = new ArrayList<CuePoint>();
}

@Entity
public class CuePoint {

   @ManyToOne(cascade = CascadeType.ALL)
   @JoinColumn(name = "video_id", insertable = false, updatable = false)
   private VideoOnDemand video;
}

The mappedBy attribute must contain the name of the attribute of the other side of the association.

Note that this is indeed what is described at paragraph 2.2.5.3.1.1. of the documentation.