2009-03-23 5 views
1

J'écris un Hibernate CompositeUserType, et pour sérialiser l'objet personnalisé en JDBC, j'ai besoin de connaître le nom de la table que je suis en train de mettre à jour (car il y a une certaine configuration pour mon outil attaché à la table). La seule façon dont je peux faire ce travail maintenant, est de paramétrer explicitement mon UserType avec le nom de table d'entité, qui est redondant et sujet aux erreurs.Création d'un Hibernate UserType personnalisé: recherche du nom de la table d'entité actuelle

Existe-t-il un moyen d'obtenir cette information dans "nullSafeSet"?

public void nullSafeSet(PreparedStatement ps, Object value, int index, 
     SessionImplementor session) 
     throws HibernateException, SQLException { 

    // find out the entity table name here 

Si non, est-il un moyen de se rendre à la définition de l'entité propriétaire lors de l'initialisation du UserType (similaire à la façon dont sont passés les paramètres)?

Répondre

1

J'ai fait quelque chose de similaire où j'avais besoin de définir une propriété sur le type personnalisé à l'exécution en fonction d'autres paramètres. Utilisation de la configuration, vous pouvez obtenir le type personnalisé pour définir une propriété dynamique comme celui-ci:

for (Iterator iter=configuration.getClassMappings(); iter.hasNext();) { 
    PersistentClass pc = (PersistentClass)iter.next(); 
    for (Iterator iter2=pc.getPropertyIterator(); iter2.hasNext();) { 
    Property property = (Property)iter2.next(); 
    if (property.getType().getName().equals("your custom type")) { 
     SimpleValue v = (SimpleValue)property.getValue(); 
     v.getTypeParameters().setProperty("table property", pc.getTable().getName()); 
    } 
    } 
} 

De toute évidence, il y a beaucoup d'hypothèses ici (une table par entité, type personnalisé est une propriété unique, etc.) , mais ça devrait marcher.

Une autre possibilité que je n'ai pas essayée est d'utiliser les métadonnées PreparedStatement dans la méthode nullSafeSet, comme: statement.getMetaData(). GetTableName (index).

Questions connexes