JPA

2012-03-11 9 views
1

とJavaでMapオブジェクトにテーブルを結合するマップIは、5つのMySQLテーブルJPA

  • employee
  • qualification
  • institute qualification_institute(ID、qualification_id、 institute_id)
  • employee_qualification_institute(EMPLOYEE_IDを持っていますqualification_institute_id)

qualification_instituteは取得可能な資格と機関との間のManyToMany接続を定義し、employee_qualification_instituteは特定の従業員が資格を取得した機関を教えてくれます。 EclipseLinkはEmployeeクラスにSet<QualificationInstitute>フィールドを生成しますが、代わりにMap<Qualification, Institute>が必要です。その地図にどのように注釈を付けるべきですか?プロパティベースのアクセスがあるので、getterメソッドでクエリを実装する必要がありますか?

Qualificationクラスには既にSet<Institute>フィールドが含まれ、クラスInstituteにはSet<Qualification>フィールドが含まれています。 Employeeの中に地図を注釈することができれば、明らかにEmployeeQualificationInstituteクラスを持つ必要がなくなります。

+0

だけで理解する... ManyToManyToMany関係した理由は何ですか?従業員EがInstitute I1の資格Q1、Institute I1の資格Q2、Institute I2の資格Q1、Institute I2の資格Q2を持つ可能性はありますか?はいの場合はOK、そうでない場合はDBデザインが悪いです。 – perissf

+0

はい。各機関が複数の資格を提供している間に、複数の機関で一定の資格を取得することができます。従業員クラス内に必要なマップは、どの資格がどの機関から取得されたかを示すことです。 –

答えて

1

この場合、あなたはできません。設計上、資格は研究所ごとに固有のものではないためです。そして私はMapのJavaDocから引用します:

キーを値にマップするオブジェクトです。マップに重複キーを含めることはできません。各キーは最大でも1つの値にマップできます。

ただし、EmployeeQualificationInstituteクラスは必要ありません。

例:

@Entity 
public class Employee 
{ 
    @Id 
    @GeneratedValue 
    private Long id; 
    @JoinTable(name="EmployeeQualificationInstitute", 
     joinColumns={ 
      @JoinColumn(name = "id", referencedColumnName = "employee_id") 
     } 
    ) 
    private Set<QualificationInstitute> 
} 

@Entity 
public class Qualification 
{ 
    @Id 
    @GeneratedValue 
    private Long id; 
} 

@Entity 
public class Institute 
{ 
    @Id 
    @GeneratedValue 
    private Long id; 
} 

@Entity 
public class QualificationInstitute 
{ 
    @EmbeddedId 
    private QualificationInstitutePK key; 

    @MapsId(value = "qualification_id") 
    @ManyToOne 
    @JoinColumn(name = "qualification_id", referencedColumnName = "id") 
    private Qualification qualification; 

    @MapsId(value = "institute_id") 
    @ManyToOne 
    @JoinColumn(name = "institute_id", referencedColumnName = "id") 
    private Institute institute; 
} 

@Embeddable 
public class QualificationInstitutePK 
{ 
    @Column(name = "qualification_id") 
    private Long qualification_id; 

    @Column(name = "institute_id") 
    private Long institute_id; 
}