2013-07-08 4 views
2

J'ai créé deux entités pour les tables HOBBY et STUDENT, mais j'ai des difficultés à récupérer les informations dont j'ai besoin dans le tableau Join.Relier la table et la relation OneToMany dans Hibernate

C'est le schéma:

STUDENT    STUDENT_HOBBY  HOBBY 
--------    -----------   -------- 
id ------------------ student_id 
name     hobby_id ---------- id 
lastname         hobby_name  
---------    ----------   -------- 

where 
Student to student_hobby = one to many 
Hobby to student_hobby = one to many 
(that means a student may have many hobbies and a hobby can belong to more than one student) 

Ceci est la classe d'entité étudiant:

@Entity 
@Table(name="STUDENT") 
public class Student { 

    @OneToMany 
    @JoinTable(name="student_hobbies", [email protected](name="student_id"), 
     [email protected](name="hobby_id")) 
    private Collection<Hobby> hobbies; 

    @Id 
    @Column(name="ID") 
    @GeneratedValue 
    private Integer id; 

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

    @Column(name="LASTNAME") 
    private String lastName; 

    // Getters and setters here 
} 

Ceci est la classe d'entité Hobby:

@Entity 
@Table(name="HOBBY") 
public class Hobby { 

    @OneToMany 
    @JoinTable(name="student_hobbies", [email protected](name="hobby_id"), 
     [email protected](name="student_id")) 
    private Collection<Student> students; 

    @Id 
    @Column(name="ID") 
    @GeneratedValue 
    private Integer id; 

    @Column(name="HOBBY_NAME") 
    private String hobby_name; 

    // Getters and setters here 
} 

Maintenant, je voudrais mettre en œuvre le DAO suivant, mais je ne sais pas exactement comment faire:

public interface MyDAO { 
    public void addHobbyForStudent(int student_id, int hobby_id); 
    public void RemoveHobbyForStudent(int student_id, int hobby_id); 
} 

Dois-je créer une autre classe d'entité pour la table de jointure? Quelqu'un pourrait-il me donner quelques indications sur la façon de suivre?

Répondre

2

Vous pouvez créer une classe d'entité pour la table de jointure, mais vous n'avez pas besoin et vous ne devriez probablement pas. Cela créera simplement plus de code à maintenir. Vous devez créer une entité pour la table de jointure s'il y a des données dans la table de jointure que vous devez interroger. EG: s'il y avait un start_time ou quelque chose dans la table join et que vous vouliez voir start_time.

Vous devez utiliser l'annotation @ManyToMany lorsque vous évitez une entité de table jointe. La documentation que j'ai liée à donne quelques bons exemples de la façon de faire ceci:

Example 1: 

// In Customer class: 

@ManyToMany 
@JoinTable(name="CUST_PHONES") 
public Set<PhoneNumber> getPhones() { return phones; } 

// In PhoneNumber class: 

@ManyToMany(mappedBy="phones") 
public Set<Customer> getCustomers() { return customers; } 

Example 2: 

// In Customer class: 

@ManyToMany(targetEntity=com.example.PhoneNumber.class) 
public Set getPhones() { return phones; } 

// In PhoneNumber class: 

@ManyToMany(targetEntity=com.example.Customer.class, mappedBy="phones") 
public Set getCustomers() { return customers; } 

Example 3: 

// In Customer class: 

@ManyToMany 
@JoinTable(name="CUST_PHONE", 
    joinColumns= 
     @JoinColumn(name="CUST_ID", referencedColumnName="ID"), 
    inverseJoinColumns= 
     @JoinColumn(name="PHONE_ID", referencedColumnName="ID") 
    ) 
public Set<PhoneNumber> getPhones() { return phones; } 

// In PhoneNumberClass: 

@ManyToMany(mappedBy="phones") 
public Set<Customer> getCustomers() { return customers; } 
Questions connexes