2010-03-25 3 views
0

J'essaie de générer des entités JPA à partir d'une base de données existante ayant un design "intéressant".Comment faire une entité d'une table de jointure sans clé primaire

La base de données possède une table appelée UserSet, qui peut contenir des liens vers plusieurs autres UserSets. Il existe une relation un à plusieurs entre UserSets et LinkedUserSets. LinkedUserSets a également une relation un à un avec les UserSets.

J'ai essayé de générer une entité JPA à partir de la structure de la base de données à l'aide de Dali JPA Tools. L'entité résultante Linkeduserset manque l'annotation @Id ou @EmbeddedId et échoue donc à compiler. Comme l'entité résultante contient seulement deux @JoinColumns (qui ne peuvent pas être marqués comme @Id), je n'ai pas encore trouvé de solution à ce problème.

La structure de la base de données ne peut être modifiée d'aucune façon.

Existe-t-il un moyen de surmonter ce problème?

Pars pertinentes de créer des déclarations de table:

CREATE TABLE `LinkedUserSets` (
    `UsrSetID` INT(11) NOT NULL DEFAULT '0' , 
    `ChildID` INT(11) NOT NULL DEFAULT '0' , 
    CONSTRAINT `fk_LinkedUserSets_UserSet1` 
    FOREIGN KEY (`UsrSetID`) 
    REFERENCES `UserSet` (`UsrSetID`)); 

CREATE TABLE `UserSet` (
    `UsrSetID` INT(11) NOT NULL AUTO_INCREMENT , 
    PRIMARY KEY (`UsrSetID`), 
    CONSTRAINT `fk_UserSet_LinkedUserSets1` 
    FOREIGN KEY (`UsrSetID`) 
    REFERENCES `LinkedUserSets` (`ChildID`)); 

entités Generated:

@Entity 
@Table(name="linkedusersets") 
public class Linkeduserset { 
    //bi-directional many-to-one association to Userset 
    @ManyToOne 
    @JoinColumn(name="UsrSetID") 
    private Userset userset1; 

    //bi-directional one-to-one association to Userset 
    @OneToOne 
    @JoinColumn(name="ChildID") 
    private Userset userset2; 
} 


@Entity 
@Table(name="userset") 
public class Userset { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="UsrSetID") 
    private int jngSetID; 

    //bi-directional many-to-one association to Linkeduserset 
    @OneToMany(mappedBy="userset1") 
    private Set<Linkeduserset> linkedusersets; 

    //bi-directional one-to-one association to Linkeduserset 
    @OneToOne(mappedBy="userset2") 
    private Linkeduserset linkeduserset; 
} 

Message d'erreur:

Entity "Linkeduserset" has no Id or EmbeddedId 

Répondre

1

Si vous souhaitez mapper ceci sans modifier la base de données, vous pouvez envisager de mapper uniquement la classe UserSet en tant qu'entité avec une relation many-to-many à elle-même et avec LinkedUserSet comme une table de jointure, de sorte que le mappage reflète vraiment ce qui est dans la base de données.

0

Vous devriez toujours ajouter une colonne PK unique à la table LinkedUserSets . Cela aidera à fortifier cette table.

Vous pouvez également créer un index (unique?) Sur LinkedUserSets (UsrSetId, ChildId) pour des recherches plus rapides.

... et ce n'est pas un design si "intéressant". Ceci est assez commun :)

+0

Je ne peux pas prendre le risque de modifier la structure de la base de données. Il pourrait casser "quelque chose d'autre" en utilisant la même base de données. Ce n'est pas la seule partie "intéressante" de la BD :-) – tputkonen

Questions connexes