La charge de l'Entité de Vue en JPA/Hibernate
J'ai une application qui utilise Spring et Hibernate. Dans ma base de données il y a quelques vues que j'ai besoin de charger dans certaines entités. Donc, je suis en train d'exécuter une requête native et de charger la classe avec des données récupérées à partir de la vue:
//In my DAO class (@Repository)
public List<MyClass> findMyEntities(){
Query query = em.createNativeQuery("SELECT * FROM V_myView", MyClass.class);
return query.getResultList();
}
et MyClass a les mêmes champs que les noms de colonne de la vue.
Le problème est qu'Hibernate ne pouvez pas reconnaître MyClass parce que ce n'est pas une entité (c'est pas annotée avec @Entity)
org.mise en veille prolongée.MappingException: entité Inconnue
Si j'ai mis MyClass comme une entité, le système essayez de créer/mettre à jour une table de l'entité en question, parce que j'ai configuré :
<property name="hibernate.hbm2ddl.auto" value="update"/>
Alors je viens en ces questions:
- Puis-je désactiver "mise en veille prolongée.hbm2ddl.auto" juste pour une seule entité?
- Est-il possible de charger les données à partir d'une vue dans une autre entité de la classe?
- Si non, quelle serait la meilleure façon, dans mon cas pour le chargement des données à partir d'un point de vue dans une classe en veille prolongée?
Grâce
OriginalL'auteur Javi | 2011-12-21
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser axtavt solution. Vous pouvez aussi exécuter votre requête, et de transformer l'
List<Object[]>
il sera de retour dans unList<MyClass>
explicitement. Ou vous pouvez faire un plan de votre vue en lecture seule entité, ce qui est probablement la meilleure solution, parce qu'il permettrait d'associations avec d'autres tableaux, l'interrogation par le biais de JPQL, Critères, ...À mon avis,
hibernate.hbm2ddl.auto
doit être utilisé uniquement pour quick n' sale prototypes. Utiliser la mise en veille prolongée sont des outils pour générer le fichier SQL permettant de créer le schéma, et de la modifier de façon à supprimer la création de la vue. De toute façon, si c'est mis à jour, il ne devrait pas ignorer la création de la table, car il existe déjà (comme un point de vue)?OriginalL'auteur JB Nizet
Placé sur votre classe
Hibernate exécuter la requête pour récupérer les données, mais pas de créer la table ou de la vue. L'inconvénient de cette solution est qu'elle ne sert qu'à faire des lectures.
OriginalL'auteur Jhonathan
Vous pouvez utiliser
AliasToBeanResultTransformer
. Puisque c'est une mise en veille prolongée-fonctionnalité spécifique, vous devez accéder à la sous-jacentes HibernateSession
:Vous pouvez déclarer des champs de votre classe comme
BigInteger
, ou d'appliquer des conversions explicites à des colonnes dans votre requête SQL (au lieu de*
).OriginalL'auteur axtavt