Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

1:M relationship in Hibernate and cascading operations

Table SUBCOURSE references COURSE COURSE(id, name) SUBCOURSE(id, course_id, name)

So, 1:M.

Hibernate generates for Course:

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "course", cascade = CascadeType.ALL)
    public Set getSubCourses() {
        return this.subCourses;
    }

for Subcourse it generates

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "course_id", nullable = false)
    public Course getCourse() {
        return this.course;
    }

Now the problem is that cascading does not work as expected. I want to create a collection of SubCourse objects (Set), fill it and then bind it to setSubCourses() of Course object. Then simply persist the Course object.

Though, having ManyToOne thing in a Subcourses table, I need to manually setCourse() before adding to collection on each object. If I do not do so, an exception is raised when persisting Course object with its collection.

What can you recommend me?

P.S. or maybe this is part of the game? setting a parent object of every child by hand?

like image 284
EugeneP Avatar asked Dec 07 '25 06:12

EugeneP


1 Answers

It seems that this is part of the game. Quote from the Hibernate book (referring to an example where Item is the parent and Bid is the child):

If you only call anItem.getBids().add(bid), no changes are made persistent! You get what you want only if the other side, aBid.setItem(anItem), is set correctly. This is consistent with the behavior in Java without Hibernate: If an association is bidirectional, you have to create the link with pointers on two sides, not just one. It’s the primary reason why we recommend convenience methods such as addBid() — they take care of the bidirectional references in a system without container- managed relationships.

The class referred to above is

public class Item {
  ...
  private Set bids = new HashSet();
  public void setBids(Set bids) {
    this.bids = bids;
  }
  public Set getBids() {
    return bids;
  }
  public void addBid(Bid bid) {
    bid.setItem(this);
    bids.add(bid);
  }
  ...
}
like image 76
Péter Török Avatar answered Dec 08 '25 19:12

Péter Török