2009-09-03 6 views
3

J'utilise ClassMetadata pour déterminer la structure d'un POJO en hibernation.Détermination de ManyToMany vs OneToMany en utilisant ClassMetadata

J'ai besoin de déterminer si une collection est OneToMany ou ManyToMany. Où est cette information? Puis-je y arriver sans utiliser de réflexion? Voir mon code ci-dessous.


//Get the class' metadata 
ClassMetadata cmd=sf.getClassMetadata(o.getClass()); 

for(String propertyName:cmd.getPropertyNames()){ 
    if (cmd.getPropertyType(propertyName).isCollectionType() && cmd.??()) //Do something with @ManyToMany collections. 
} 

Tout ce dont j'ai besoin, c'est de me dire si c'est une relation ManyTo____. Je vois getPropertyLaziness(), mais cela ne garantit pas toujours le type de collection. Des idées?

Répondre

4

Ce n'est pas si simple, malheureusement. Votre meilleur pari pour détecter c'est en vérifiant notamment la mise en œuvre CollectionPersister:

SessionFactory sf = ...; 

// Get the class' metadata 
ClassMetadata cmd = sf.getClassMetadata(o.getClass()); 

for(String propertyName:cmd.getPropertyNames()) { 
    Type propertyType = cmd.getPropertyType(propertyName); 
    if (propertyType.isCollectionType()) { 
    CollectionType collType = (CollectionType) propertyType; 

    // obtain collection persister 
    CollectionPersister persister = ((SessionFactoryImplementor) sf) 
     .getCollectionPersister(collType.getRole()); 

    if (persister instanceof OneToManyPersister) { 
     // this is one-to-many 
    } else { 
    // this is many-to-many OR collection of elements 
    } 
    } // if 
} // for 
+0

PARFAIT !!! Question bonus: Comment déterminer @ManyToOne sur @OneToOne? – User1

+0

Oh attends. Je pense que je l'ai trouvé. EntityType.isOneToOne(). Cependant, je n'aurais pas pu le trouver sans toi. J'apprécie vraiment toute ton aide! Vos entrées m'aident et j'espère que d'autres. Bon travail! – User1

+0

Je pense que j'ai parlé trop tôt. EntityType.isOneToOne() est toujours faux pour une raison quelconque. Je n'ai pas trouvé de OneToOnePersister. Des idées? – User1

0

C'est une possibilité.

Sous-classes directement connues: ManyToOneType, OneToOneType.

 SessionFactory sf = ...; 

     ClassMetadata cmd = sf.getClassMetadata(o.getClass()); 

     for (String propertyName : cmd.getPropertyNames()) { 
      Type propertyType = cmd.getPropertyType(propertyName); 

      if (propertyType.isEntityType()) { 
       EntityType entityType = (EntityType) propertyType; 

       if (entityType instanceof ManyToOneType) { 
        System.out.println("this is ManyToOne"); 
       } else if (entityType instanceof OneToOneType) { 
        System.out.println("this is OneToOne"); 
       } 
      } 
     } 
Questions connexes