2011-12-24 1 views
1

生成されたエンティティ内@ManyToManyを定義する方法:2つのテーブル間の関係のように、私は、生成されたテーブルは、<strong>従業員</strong>と呼ばれている

MedicalCompany

と私はどのように思っていましたこの生成されたテーブルと別のテーブルとの間にmanyToToMany関係を作るには、次のようなものがあります。

@ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "employee_role", joinColumns = { @JoinColumn(name = "employee_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }) 
    private Set<Role> roles = new HashSet<Role>(0); 

1- 生成されたテーブル

@SuppressWarnings("serial") 
@Entity 
@Table(name = "employee") 
@AssociationOverrides(value = { 
     @AssociationOverride(name = "pk.medicalCompany", joinColumns = @JoinColumn(name = "company_id", referencedColumnName = "id")), 
     @AssociationOverride(name = "pk.person", joinColumns = @JoinColumn(name = "employee_id", referencedColumnName = "person_id")), 
     @AssociationOverride(name = "pk.titleText"), 
     @AssociationOverride(name = "pk.employeeManager") }) 
public class Employee implements Serializable { 

    @EmbeddedId 
    private EmployeeCompanyId pk = new EmployeeCompanyId(); 

    @Transient 
    public void setEmployeeManager(long employeeManager) { 
     this.pk.setEmployeeManager(employeeManager); 
    } 

    public long getEmployeeManager() { 
     return pk.getEmployeeManager(); 
    } 

    @Transient 
    public void setTitleText(String titleText) { 
     this.pk.setTitleText(titleText); 
    } 

    public String getTitleText() { 
     return pk.getTitleText(); 
    } 

    public void setPerson(Person person) { 
     this.pk.setPerson(person); 
    } 

    @Transient 
    public Person getPerson() { 
     return this.pk.getPerson(); 
    } 

    public void setMedicalCompany(MedicalCompany medicalCompany) { 
     this.pk.setMedicalCompany(medicalCompany); 
    } 

    @Transient 
    public MedicalCompany getMedicalCompany() { 
     return this.pk.getMedicalCompany(); 
    } 

    public void setPk(EmployeeCompanyId pk) { 
     this.pk = pk; 
    } 

    public EmployeeCompanyId getPk() { 
     return pk; 
    } 

} 

2- EmployeeCompanyId

@SuppressWarnings("serial") 
@Embeddable 
public class EmployeeCompanyId implements Serializable { 

    @ManyToOne 
    private Person person; 

    @ManyToOne 
    private MedicalCompany medicalCompany; 

    @Size(max = 150, message = "{long.value}") 
    @Column(name = "title_text", length = 150, nullable = true) 
    private String titleText; 

    @Column(name = "employee_manager") 
    private long employeeManager; 

    public Person getPerson() { 
     return person; 
    } 

    public void setPerson(Person person) { 
     this.person = person; 
    } 

    public MedicalCompany getMedicalCompany() { 
     return medicalCompany; 
    } 

    public void setMedicalCompany(MedicalCompany medicalCompany) { 
     this.medicalCompany = medicalCompany; 
    } 

    public String getTitleText() { 
     return titleText; 
    } 

    public void setTitleText(String titleText) { 
     this.titleText = titleText; 
    } 

    public long getEmployeeManager() { 
     return employeeManager; 
    } 

    public void setEmployeeManager(long employeeManager) { 
     this.employeeManager = employeeManager; 
    } 

} 

答えて

1

あなた@EmbeddedIdある@Embeddable内の関係を持つことができません。関係は通常の@Embeddableでしかできません。


JPA 2.0 FR仕様、11.1.15 EmbeddedId注釈:埋め込まれたIDクラス内で定義

関係マッピングがあるがをサポートしていない 。

Hibernate 3.5 doc、2.2.3.2.1。埋め込まれたIDのオブジェクトに@EmbeddedIdプロパティ

、関連は、関連するエンティティの識別子として表さあります。しかし、その値を@MapsIdアノテーションを介してエンティティ内の通常の関連付けにリンクすることができます。


あなたが行うことができます少なくともは組み込み可能で、主キーの型を使用することです。埋め込み可能なエンティティにマップすることができます。言い換えれば、あなたは次のようなものを持つことができます:

@Embeddable 
public class EmployeeCompanyId implements Serializable { 

    private int personId; 

    // ... 
} 

@Entity 
public class Employee { 

    @EmbeddedId 
    private EmployeeCompanyId pk = new EmployeeCompanyId(); 

    @MapsId("personId") 
    @ManyToOne 
    private Person person; 

    // ... 
} 
関連する問題