2012-04-24 3 views
17

Ich brauche eine viele zu viele Hibernate Mapping benötigt 3 Joins. Ich habe versucht, eine Lösung ohne Zwischenelement wie LecturerCourse zu finden.Wie erstelle ich viele bis viele Hibernate Mapping für zusätzliche Eigenschaft aus der Join-Tabelle?

Ich habe eine viele zu viele Beziehung in meiner Datenbank zwischen meinem Dozenten und Kurstabellen. Ein Kurs kann von mehreren Dozenten gegeben werden, während ein Dozent mehrere Kurse geben kann.

Ich habe Kurse vor der Hand gespeichert. Ich muss jedoch Kurse zum Dozenten zuweisen. Wenn ich Kurse vergebe, speichere ich auch die Kapazität dieses Kurses.

Meine Datenbank-Diagramm:

enter image description here

Ich benutze Hibernate und Frühling. Ich brauche ein Hibernate Mapping, wenn ein Kurs einem Dozenten zugewiesen ist. Ich muss dem Kapazitätsfeld Werte hinzufügen.

Mein Dozent Mapping:

@Entity 
@Table(name="LECTURER") 
public class Lecturer { 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="LECTURER_ID_SEQ") 
    @SequenceGenerator(name="LECTURER_ID_SEQ", sequenceName="LECTURER_ID_SEQ") 
    private Long Id; 

    @Column(name="NAME") 
    private String name; 

    @Column(name="SURNAME") 
    private String surname; 


    @Column(name="EMAIL") 
    private String email; 

    @Column(name="USERNAME") 
    private String username; 

    @Column(name="PASSWORD") 
    private String Password; 

    @ManyToMany 
    @JoinTable(
      name="LECTURER_COURSE", 
      [email protected](name="LECTURER_ID"), 
      [email protected](name="COURSE_ID") 
    ) 
    private List<Course> courses; 

    //getters - setters 
} 

Mein Kurs-Mapping:

@Entity 
@Table(name="COURSE") 
public class Course { 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="COURSE_ID_SEQ") 
    @SequenceGenerator(name="COURSE_ID_SEQ", sequenceName="COURSE_ID_SEQ") 
    private Long id; 

    @Column(name="NAME") 
    private String name; 

    @Column(name="CODE") 
    private String code; 
} 

Jede Idee, wie mein Problem zu lösen?

+0

Was haben Sie versucht? Wenn Sie einem Dozenten einen Kurs hinzufügen und dann den Dozenten speichern, können Sie in der Datenbank sehen, ob die Tabellen LECTURER und LECTURER_COURSE ausgefüllt sind? –

+0

ja es wird die Datenbank auffüllen. Meine Frage ist, wie man Kapazitätswerte für Kurse speichert. ein Kurs kann mehrere Kapazitäten für jeden Dozenten haben. Wie kann ich das Kapazitätsfeld abbilden? – erencan

+0

Werfen Sie einen Blick auf axtavts Antwort auf diese Frage: http://stackoverflow.com/questions/4751902/Adding-additional-property-to-hibernate-jointable –

Antwort

27

Sie benötigen @EmbeddedId und @Embeddable Anmerkungen verwenden, um dieses Problem zu lösen:

Dozent Klasse:

@Entity 
@Table(name="LECTURER") 
public class Lecturer { 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.lecturer", cascade=CascadeType.ALL) 
Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>(); 

//all others properties Setters and getters are less relevant. 

} 

Course Klasse:

@Entity 
@Table(name="COURSE") 
public class Course { 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.course", cascade=CascadeType.ALL) 
Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>(); 

//all others properties Setters and getters are less relevant. 

} 

LecturerCourse Klasse:

@Entity 
@Table(name = "lecturer_course") 
@AssociationOverrides({ 
     @AssociationOverride(name = "pk.lecturer", 
      joinColumns = @JoinColumn(name = "LECTURER_ID")), 
     @AssociationOverride(name = "pk.course", 
      joinColumns = @JoinColumn(name = "COURSE_ID")) }) 
public class LecturerCourse { 

    private LecturerCourseID pk = new LecturerCourseID(); 

    @Column(name = "CAPACITY", nullable = false, length = 10) 
    private String capacity; 

    @EmbeddedId 
    public LecturerCourseID getPk() { 
     return pk; 
    } 

} 

Jetzt ist der Primärschlüssel:

@Embeddable 
public class LecturerCourseID implements java.io.Serializable { 

    private Lecturer lecturer; 
    private Course course; 

    @ManyToOne 
    public Stock getLecturer() { 
     return lecturer; 
    } 

    public void setLecturer(Lecturer lecturer) { 
     this.lecturer= lecturer; 
    } 

    @ManyToOne 
    public Course getCourse() { 
     return course; 
    } 

    public void setCourse(Course course) { 
     this.course= course; 
    } 

} 

jetzt Ihr Haupt so etwas wie dies sein sollte:

Lecturer lecturer1 = new Lecturer(); 
Course math = new Course(); 
LecturerCourse lecturer1math = new LecturerCourse(); 
lecturer1math.setCapacity("capacity"); 
lecturer1math.setLecturer(lecturer1); 
lecturer1math.setCourse(math); 
lecturer1.getLecturerCourses().add(lecturer1math); 

//saving object 
session.save(lecturer1); 

Sie müssen diese Klasse markiert sicher sein als @EmbeddableSerializable Marker-Schnittstelle implementieren soll.

Ich hoffe, es hilft.

+0

Vielen Dank für die ausführliche Antwort. Ich habe das Problem ähnlich wie Ihre Antwort gelöst. Ich frage mich jedoch, ob es eine Lösung ohne eine intermediäre Entität wie LecturerCourse gibt. Ich habe versucht, diese http: // Stackoverflow.com/questions/4751902/adding-additional-property-zu-hibernate-jointable. aber es hat nicht funktioniert. Ich lese die Dokumentation http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html. konnte das Problem immer noch nicht lösen. – erencan

+0

Leider kenne ich keine andere Methode. Ich verwende den obigen Code, um zusammengesetzte Primärschlüssel und zusätzliche Spalten in Ihrem Fall zu erstellen. –

+0

ich sehe. Danke noch einmal. wenn ich eine Lösung finden kann. Ich werde es auch an Sie senden. – erencan

Verwandte Themen