Technical blog

November 26, 2010

[Example] Hibernate One-To-Many bidirectional relation

Filed under: database, hibernate, java — Tags: , , — paawak @ 01:59

Let us consider the relation between Semester and Subjects. A Semester has a collection of Subjects. Each Subject, in turn, has a reference to the Semester.

This is illustrated as below:

public class Semester {
 
    private Long semesterId;
 
    private String semesterName;
 
    private Set<Subject> subjects;
 
...
 
}
 
public class Subject {
 
    private Long subjectId;
 
    private String subjectName;
 
    private Semester semester;
...
}

This is how I convert it to Hibernate entities:

@Entity
public class Semester implements Serializable {
 
    private static final long serialVersionUID = -6067841723974478563L;
 
    @Id
    @Column(name = "SEMESTER_ID")
    @SequenceGenerator(name = "seq", allocationSize = 1, initialValue = 1, sequenceName = "SEQ_SEMESTER")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
    private Long semesterId;
 
    @Column(name = "SEMESTER_NAME")
    private String semesterName;
 
    @OneToMany(mappedBy = "semester", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Subject> subjects;
 
...
}
 
@Entity
public class Subject implements Serializable {
 
    private static final long serialVersionUID = 5705981176568667418L;
 
    @Id
    @Column(name = "SUBJECT_ID")
    @SequenceGenerator(name = "seq", allocationSize = 1, initialValue = 1, sequenceName = "SEQ_SUBJECT")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
    private Long subjectId;
 
    @Column(name = "SUBJECT_NAME")
    private String subjectName;
 
    @ManyToOne
    @JoinColumn(name = "SEMESTER_ID_FK")
    private Semester semester;
 
...
}

Further, I should be able to insert it with the following code:

        Set<Subject> subjects = new HashSet<Subject>();
 
        Semester semester = new Semester();
 
        for (int i = 1; i <; 5; i++) {
 
            Subject subject = new Subject();
            subject.setSubjectName("subject_" + i);
            subject.setSemester(semester);
 
            subjects.add(subject);
 
        }
 
        semester.setSemesterName("1st sem");
        semester.setSubjects(subjects);
 
        Transaction tr = session.beginTransaction();
        session.save(semester);
        tr.commit();

The SQL script is:

CREATE SEQUENCE  SEQ_SEMESTER
START WITH 1
INCREMENT BY 1;
 
CREATE TABLE SEMESTER (
 
	SEMESTER_ID NUMBER PRIMARY KEY NOT NULL,
	SEMESTER_NAME VARCHAR(50) NOT NULL
 
);
 
CREATE SEQUENCE  SEQ_SUBJECT
START WITH 1
INCREMENT BY 1;
 
CREATE TABLE SUBJECT (
 
	SUBJECT_ID NUMBER PRIMARY KEY NOT NULL,
	SUBJECT_NAME VARCHAR(50) NOT NULL,
	SEMESTER_ID_FK NUMBER NOT NULL,
	CONSTRAINT CNSTR_SEMESTER_ID_FK FOREIGN KEY(SEMESTER_ID_FK) REFERENCES SEMESTER(SEMESTER_ID)
 
);

The sources can be found here.

Powered by WordPress