2012-04-30 6 views
6

J'ai quelques enregistrements supprimés logiquement (ie active=false) qui causent des problèmes avec ma correspondance @ManyToOne car plus d'un résultat est renvoyé par la colonne de jointure.ManyToOne avec la clause where

je dois inclure uniquement les enregistrements où active=true que je pensais que je pouvais réaliser par:

@ManyToOne 
@NotFound(action = NotFoundAction.IGNORE) 
@JoinColumn(name = "site_id", referencedColumnName = "site_id", insertable = false, updatable = false) 
@WhereJoinTable(clause = "active=true") 
private Site site; 

Cependant, il semble que le WhereJoinTable n'est pas utilisé par mise en veille prolongée (peut-être sa seule valable pour OneToMany?) Depuis le active=true n'apparaît pas dans le SQL généré (journaux) et le problème persiste.

Est-il possible d'inclure une clause where pour la jointure d'un ManyToOne et comment?

Répondre

2

@WhereJoinTable n'est pas pris en charge par @ManyToOne. Il y a bug HHH-4335 sur sujet ouvert depuis cinq ans. Je ne suis au courant d'aucune solution de contournement, sauf l'utilisation de vue (dans le cas d'un accès en lecture seule) comme mentionné dans le rapport de bogue.

+0

est-il possible de re-mapper la même table et mettre un filtre sur la cartographie, à savoir si j'ai une lecture seule entité 'ActiveSite'? – pstanton

+0

Oui, vous pouvez le faire. Mais comme la connexion attendue entre les instances d'ActiveSite et Site est alors inconnue à Hibernate. Ainsi, les modifications apportées au site correspondant ne sont reflétées dans ActiveSite que lorsqu'elles sont lues (ou actualisées) à partir de la base de données. –

+0

Oui, ce serait acceptable dans ce cas, mais j'essaie d'utiliser '@Where (clause =" active = true ")' sur mon '@ Entity' et Hibernate le convertit en' site0_.active = site0_. true' .. si vous pouvez m'aider à résoudre celui-ci je vais vous donner la tique (puisque vous avez raison dans votre réponse ..) merci pour l'aide! – pstanton

1

@JoinColumnOrFormula anotation est une solution appropriée

+0

Ceci n'est pas une réponse à la question, veuillez utiliser les commentaires pour les discussions et les messages ne concernant pas la réponse – Moseleyi