2010-09-14 6 views
2

I ont une table PROPERTY dont la clé primaire est définie comme (REF_1_ID, PROPERTY_ID, PROPERTY_IDX), où PROPERTY_IDX va de 0 à n pour les mêmes valeurs de (REF_1_ID, PROPERTY_ID).mappage d'une clé composite avec colonne incrémentée dans Hibernate

Je voudrais laisser à Hibernate de gérer la valeur de PROPERTY_IDX, de sorte que je puisse le définir à null pour de nouveaux objets et l'avoir rempli lors de la sauvegarde.

Quelle est la manière la plus directe de réaliser cela?

+0

Juste pour la curiosité: utilisez-vous une autre entité avec cascade activé pour sauver sa imbriquée propriété d'entité ou vous sauver une simple propriété (comme save (propriété)) –

+0

@Arthur: Je viens d'utiliser un 'save()' –

Répondre

1

Pour les mêmes valeurs de (REF_1_ID, PROPERTY_ID)

Vous pouvez récupérer le nombre de Propriété de l'entité avec le même (REF_1_ID, PROPERTY_ID) vous avez

Integer indexValue = (Integer) 

session.createQuery("select count(*) from Property p where p.propertyId.rederenceId = :referenceId and p.propertyId.propertyId = :propertyId") 
     .setParameter("referenceId", referenceId) 
     .setParameter("propertyId", propertyId) 
     .iterate() 
     .next(); 

Ensuite, vous configurez

propertyId.setIndexValue(indexValue); 

Vous pouvez utiliser un HibernateInterceptor pour atteindre cette fonctionnalité (Méthode onSave) Gardez à l'esprit les problèmes de concurrence lorsqu'ils traitent avec ce scénario

Ou encapsulent comme suit

@IdClass(PropertyId.class) 
public class Property { 

    private Integer referenceId; 
    private Integer propertyId; 
    private Integer indexValue; 

    /** 
     * You can use some repository instead 
     * 
     * setUp by using Either constructor Or setter injection 
     */ 
    private Session session; 

    public Property() {} 
    public Property(Session session) { 
     this.session = session; 
    } 

    @Id 
    public Integer getIndexValue() { 
     if(indexValue != null) 
      return indexValue; 

     return (Integer) 

      session.createQuery("select count(*) from Property p where p.propertyId.rederenceId = :referenceId and p.propertyId.propertyId = :propertyId") 
        .setParameter("referenceId", referenceId) 
        .setParameter("propertyId", propertyId) 
        .iterate() 
        .next(); 
    } 

} 
+0

En espérant que je trouverais quelque chose de plus simple, mais cela semble être le seul moyen. Merci! –

Questions connexes