2009-06-01 5 views
4

Je vais avoir du mal à obtenir une mise en veille prolongée sélectionnez pour retourner un objet graphique correctement rempli, lorsque la sélection contient des jointures dans de nombreuses collections.Mise en veille prolongée - Sélection sur plusieurs collections se joint à

Par exemple:

String sql = "select distinct changeset " + 
      "from Changeset changeset " + 
      "join fetch changeset.changeEntries as changeEntry " + 
      "join fetch changeEntry.repositoryEntity as repositoryEntity " + 
      "join fetch repositoryEntity.repository as repository " + 
      "where repository.connectionName = :connectionName"; 
  • Un Changeset a beaucoup ChangeEntries
  • A ChangeEntry a un RepositoryEntity
  • A RepositoryEntity a un dépôt

La déclaration ci-dessus renvoie les données correctes, mais le graphe d'objets n'est pas correctement rempli - c.-à-d., chaque ensemble de modifications contient chaque élément ChangeE ntry, pas seulement ses propres enfants.

Voici les extraits pertinents de ces deux classes:

public class Changeset { 

    @NotNull 
    @OneToMany(mappedBy="changeset", targetEntity=ChangeEntry.class, cascade={CascadeType.ALL }, fetch=FetchType.EAGER) 
    private Set<IChangeEntry> changeEntries; 

Et ...

public class ChangeEntry { 

    @NotNull 
    @ManyToOne(targetEntity=Changeset.class) 
    @ForeignKey(name="FkChangeEntryChangeset") 
    private IScmChangeset changeset; 

    @NotNull 
    @ManyToOne(targetEntity=RepositoryEntity.class, cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
    @ForeignKey(name="FkChangeEntryRepoEntity") 
    private IRepositoryEntity repositoryEntity; 

Toute aide est grandement appréciée

Cordialement

Marty

+0

Vous avez ajouté les informations de mappage pour Repository, pas pour ChangeSet dans ChangeEntry. – rudolfson

+0

Merci - J'ai ajouté Changeset –

Répondre

1

Marty:

J'ai eu ce même problème et je ne pouvais pas trouver une solution appropriée. Vous pouvez utiliser des transformateurs simples de résultat pour contrôler le nombre d'objets qui sont retournés:

CriteriaSpecification.ROOT_ENTITY 
CriteriaSpecification.DISTINCT_ROOT_ENTITY 

Mais les objets contiendraient toujours les résultats complets pour leurs enfants. Je suis passé à travers un excellent article qui utilise un modèle DTO avec des projections et le transformateur aliasToBean.

Ici, il est: http://swik.net/Hibernate/Hibernate+GroupBlog/Hibernate+3.2:+Transformers+for+HQL+and+SQL/cmxs

Cela a bien fonctionné pour moi. Le plus gros problème est que vous devez créer ces objets DTO aplatis. Pour moi, ce n'est pas un gros problème parce que mes objets DTO spécialisés sont utilisés dans les résultats de recherche et sont très réutilisables, en plus je n'aurai pas besoin de beaucoup d'entre eux.

Je sais que cela ne répond pas directement à votre question, si vous trouvez un moyen d'atteindre votre objectif s'il vous plaît mettre à jour le poste que j'aimerais voir la solution.

0

Le chargement d'une entité par son ID fonctionne-t-il correctement? Si non - lisez la suite. :-)

Je ne sais pas si vous utilisez @ForeignKey suffit. Essayez d'ajouter un @JoinColumn aux nombreux membres de votre relation. Par exemple.

@NotNull 
@ManyToOne(targetEntity=RepositoryEntity.class, cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
@ForeignKey(name="FkChangeSet") 
@JoinColumn(name = "CHANGESET_ID", referencedColumnName = "ID") 
private Changeset changeset; 

Note: Je viens de voir, que vous montrer les informations de cartographie pour Repository, mais je suppose que celui pour Changeset ressemble.

+0

Merci pour la réponse ... oui, le chargement d'une entité par son ID fonctionne. Le @JoinColumn ne devrait pas être nécessaire, car Hibernate peut le faire à partir de targetEntity du @ManyToOne. L'annotation @ForeignKey existe seulement pour donner un nom à la clé étrangère, donc je peux obtenir des erreurs significatives quand les choses tournent mal (comme elles le font fréquemment!) –

+0

En ce qui concerne @ForeignKey - c'est ce que j'ai deviné. Invocation de @JoinColumn - Ne pas indiquer le nom de la colonne de clé étrangère. La colonne référencée peut être résolue à partir de l'entité cible, c'est vrai. Mais la colonne de clé étrangère? – rudolfson

Questions connexes