2012-04-24 28 views
17

Tôi cần có nhiều ánh xạ hibernate cần 3 tham gia. Tôi đã cố gắng tìm ra giải pháp không có thực thể trung gian như LecturerCourse.Làm cách nào để tạo nhiều bản đồ ngủ đông cho tính năng bổ sung từ bảng tham gia?

Tôi có nhiều mối quan hệ trong cơ sở dữ liệu giữa giảng viên và bảng khóa học của mình. Một khóa học có thể được đưa ra bởi một số giảng viên trong khi một giảng viên có thể cung cấp cho một số khóa học.

Tôi có các khóa học được lưu trữ trước khi quay tay. Tuy nhiên, tôi cần phải chỉ định các khóa học cho giảng viên. Khi tôi chỉ định các khóa học, tôi cũng lưu trữ khả năng của khóa học đó.

My sơ đồ cơ sở dữ liệu:

enter image description here

tôi sử dụng hibernate và mùa xuân. Tôi cần một bản đồ ngủ đông khi một khóa học được chỉ định bất kỳ giảng viên nào. Tôi cần thêm giá trị vào trường dung lượng.

giảng viên lập bản đồ của tôi:

@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 
} 

nhiên lập bản đồ của tôi:

@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; 
} 

Bất kỳ ý tưởng làm thế nào để giải quyết vấn đề của tôi?

+0

Bạn đã thử những gì? Nếu bạn thêm một khóa học vào một giảng viên, và sau đó lưu các giảng viên, bạn có thể nhìn thấy trong cơ sở dữ liệu nếu các bảng LECTURER và LECTURER_COURSE được dân cư? –

+0

có nó sẽ điền vào cơ sở dữ liệu. câu hỏi của tôi là làm thế nào để lưu trữ các giá trị dung lượng cho các khóa học. một khóa học có thể có một số năng lực cho mỗi giảng viên. làm thế nào tôi có thể ánh xạ trường năng lực? – erencan

+0

Hãy xem câu trả lời của axtavt cho câu hỏi này: http://stackoverflow.com/questions/4751902/adding-additional-property-to-hibernate-jointable –

Trả lời

27

Bạn cần phải sử dụng @EmbeddedId@Embeddable chú thích để giải quyết vấn đề này:

Giảng Class:

@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. 

} 

lớp khóa học:

@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 Class:

@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; 
    } 

} 

Bây giờ Primary Key:

@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; 
    } 

} 

nay chính của bạn nên được một cái gì đó như thế này:

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); 

Bạn cần phải chắc chắn rằng lớp đánh dấu là @Embeddable nên thực hiện Serializable giao diện đánh dấu.

Hy vọng điều đó sẽ hữu ích.

+0

cảm ơn bạn rất nhiều vì câu trả lời chi tiết. tôi đã giải quyết vấn đề tương tự như câu trả lời của bạn. Tuy nhiên, tôi tự hỏi nếu có bất kỳ giải pháp mà không có một thực thể trung gian như LecturerCourse. tôi đã thử http: // stackoverflow đó.com/questions/4751902/add-additional-property-to-hibernate-jointable. nhưng nó không hoạt động. tôi đọc tài liệu http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html. vẫn không thể giải quyết vấn đề. – erencan

+0

Thật không may, tôi không quen với phương pháp khác. Tôi đang sử dụng mã ở trên để tạo các khóa chính Composite và các cột bổ sung trong trường hợp của bạn. –

+0

tôi hiểu. cảm ơn một lần nữa. nếu tôi có thể tìm được giải pháp. tôi cũng sẽ gửi nó cho bạn. – erencan

Các vấn đề liên quan