2010-08-27 8 views
1

J'ai deux entités: projet, employésnombreux à plusieurs une cartographie façon et utiliser seulement deux tables

  • employé a clé primaire {employeeId} + d'autres attributs du projet
  • a clé primaire {projectId }

code:

public class Employee { 
    Long employeeId; 
    String name;  
} 
public class Project { 
    Long projectId; 
    Collection<Employee> employees; 
} 

employé et le projet est une façon beaucoup à plusieurs. L'approche générale consiste à avoir trois tables: Employee, Project, EmployeesAssignedToProjects.

Employee 
---------- 
employeeId (PK) 
name 

Project 
---------- 
projectId (PK) 

EmployeesAssignedToProjects 
---------------------------- 
projectId (FK) 
employeeId (FK) 
{projectId,employeeId} (PK) 

Étant donné que Project n'a pas d'autres attributs que son ID, la table de projet n'est pas vraiment nécessaire. Cela amène à la question de savoir comment cette relation many-to-many doit être mappée maintenant que Project est essentiellement mappé à EmployeesAssignedToProjects.

Notez que Employee n'a pas de pointeur vers Project. La construction mappedBy typique ne peut pas être utilisée ici.

[- Mise à jour -]

Le problème est un peu plus compliqué: deux projets et les employés ont des clés composites.

  • clé du projet est {COMPANYID, projectId} clé de
  • employé est {COMPANYID, employeeId}

I a adopté les 3 tableaux mis en place. La table PROJECT_EMPLOYEE a trois colonnes: companyId, employeeId, projectId. Et je cartographiées dans xml:

<many-to-many name="PROJECT" > 
<join-table name="PROJECT_EMPLOYEE"> 
    <join-column name="companyId" referenced-column-name="companyId"/> 
    <join-column name="employeeId" referenced-column-name="employeeId" /> 
    <inverse-join-column name="companyId" referenced-column-name="companyId" /> 
    <inverse-join-column name="projectId" referenced-column-name="projectId" /> 
</join-table> 
</many-to-many>  

J'ai reçu une erreur se plaignant COMPANYID apparaissant plusieurs fois: colonne répétée dans la cartographie pour la collecte: colonne Project.employees: COMPANYID

Répondre

3

Notez que Employee n'a pas de pointeur vers Project. La construction mappedBy typique ne peut pas être utilisée ici.

Cela n'a aucune importance de toute façon. Et le fait est que toutes les relations ManyToMany nécessitent un JoinTable. Le JoinTable est défini en utilisant le @JoinTable implicitement ou explicitement.

@Entity 
public class Project { 
    @Id 
    @Column(name="PROJECTID") 
    private Long projectId; 

    @ManyToMany 
    @JoinTable(
     name="PROJECT_EMPLOYEE", 
     joinColumns={@JoinColumn(name="PROJECT_PROJECTID", referencedColumnName="PROJECTID")}, 
     inverseJoinColumns={@JoinColumn(name="EMPLOYEE_EMPLOYEEID", referencedColumnName="EMPLOYEEID")}) 
    private Collection<Employee> employees; 
    ... 
} 

Vous pouvez essayer pour définir la table PROJECT lui-même comme le JoinTable si vous avez besoin lit support (et je ne suis même pas sûr qu'il fonctionne correctement), mais cela ne fonctionnera pas pour écrit. En d'autres termes, je voudrais coller à la construction régulière pour représenter des relations many-to-many dans une base de données, c'est-à-dire avec une table de jointure.

+0

Merci Pascal, s'il vous plaît voir la [Mise à jour]. –

+0

@Candy De rien. Mais s'il vous plaît, postez la * nouvelle * question comme une nouvelle question. Liez-le à celui-ci si vous le souhaitez, mais votre mise à jour est une question et un problème différents, même s'ils sont liés. S'il vous plaît, ne mélangez pas les problèmes en une seule question. Je ne répondrai pas ici. –

+0

Est-il possible de mapper @JoinColumn (nom = "EMPLOYEE_EMPLOYEEID") à une autre clé unique de la table Employe? Je ne peux pas faire cela. Je voudrais qu'une contrainte chaîne unique apparaisse au lieu d'entiers – momomo

0

Compte tenu des fichiers de classe que vous êtes probablement vous avez fournis en essayant de changer n - m relation à n - 0..1 relation.

Cela peut être fait en retirant le EmployeesAssignedToProjects et dénormaliser la table Employee en ajoutant projectId (FK) à lui:

Employee 
---------- 
employeeId (PK) 
projectId (FK) 
name 

Project 
---------- 
projectId (PK) 

Est-ce que vous voulez vraiment? Je ne le recommande pas.

+0

Je ne veux pas dénormaliser la table Employee. Merci. –