Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 933
weekens Avatar asked Jul 09 '11 08:07

weekens


1 Answers

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.

like image 75
JB Nizet Avatar answered Oct 31 '22 15:10

JB Nizet