Question

Je mapper une base de données exclusive à Hibernate pour une utilisation avec Spring. Dans ce document, il y a quelques jointables que, pour l'entité A et entité B ont le schéma suivant:

CREATE TABLE AjoinB (
  idA int not null,
  idB int not null,
  groupEnum enum ('groupC', 'groupD', 'groupE'),
  primary key(idA, idB, groupEnum)
);

Comme vous pouvez le voir, cela signifie qu'il peut y avoir de multiples relations A-B qui les mettent dans des groupes différents. Je souhaite retrouver avec, pour la première ligne et la seconde entité A pour l'entité B, les ensembles suivants

Set<B> BforGroupC, BforGroupD, BforGroupE;
Set<A> AforGroupC, AforGroupD, AforGroupE;

Jusqu'à présent, je n'ai réussi à les mettre dans un jeu et ne pas tenir compte de l'attribut de la relation groupEnum:

@ManyToMany(targetEntity=B.class, cascade={ CascadeType.PERSIST, CascadeType.MERGE } )
@JoinTable(name="AjoinB", joinColumns=@JoinColumn(name="idA"), inverseJoinColumns=@JoinColumn(name="idB") )
private Set<B> BforAllGroups;

et

@ManyToMany( mappedBy = "BforAllGroups", targetEntity = A.class )
private Set<A> AforAllGroups;

Comment puis-je faire plusieurs jeux où ils appartiennent soit à GroupC, groupd ou Groupé?

Vive

Nik

Était-ce utile?

La solution

Si vous êtes considérant faisant cela, non. Les tables sont pas cher de nos jours, ce qui est de l'économie et tout, donc il suffit de créer un par association; il sera beaucoup plus facile.

Si vous êtes lié par une base de données existante et vous ne pouvez pas changer la structure de ce tableau I serait

  1. Pensez à la solution de premier skaffman (+1, BTW). En fonction de votre base de données cible, vous pourrez peut-être écrire un déclencheur pour votre point de vue qui insérer la valeur « discriminateur » adéquate.

  2. Si ce qui précède n'est pas possible dans votre base de données, une autre solution consiste à utiliser SQL personnalisé pour les opérations CRUD pour vos collections. Gardez à l'esprit que cela pas travail (par exemple votre « valeur discriminante » ne sera pas appliquée) pour les requêtes HQL complexes impliquant votre association dans le cadre de l'état. Vous pouvez également mélanger / faire correspondre cela avec ci-dessus - par exemple utiliser des vues et utiliser SQL personnalisé pour insérer / supprimer.

  3. Si les deux ci-dessus échouent, rendez-vous avec « association comme une entité distincte », comme suggéré par framer8. Cela va être assez laid (puisque nous supposons ici que vous ne pouvez pas changer vos tables) en raison des clés composites et tout le code étranger. Il peut, en effet, impossible si l'un de vos associations autorise les doublons.

Autres conseils

A ma connaissance, ne peut pas utiliser une telle colonne « discriminateur » de la manière que vous voulez. Mise en veille prolongée nécessite une table de jointure pour chacun d'eux.

Peut-être que vous pourriez être en mesure de définir des vues supplémentaires sur la table, montrant chacun des groupes?

Je pense que le conseil à tout moment vous avez besoin d'accéder à un champ dans une table de liens est de rendre la table de liaison d'un objet et une entité de mise en veille prolongée dans son propre droit. A aurait un ensemble d'objets atob et AtoB aurait un ensemble d'objets B. J'ai une situation simmilar où la table de liaison a un utilisateur associé au lien.

select joinTable.b from A a 
left join a.AtoB joinTable
where joinTable.group = 'C'

Il est pas aussi élégant que d'avoir une jointure implicite fait par mise en veille prolongée, mais il ne vous donne le contrôle dont vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top