2009-11-03 6 views
25

Disons que j'ai une table avec 200 colonnes et la plupart d'entre elles ne sont jamais utilisées.2 entités JPA sur la même table

Je mappe SmallEntity aux 10 colonnes qui sont souvent utilisées. Je l'utilise dans les associations avec d'autres entités. Il charge rapidement, consomme peu de mémoire et me rend heureux.

Mais parfois j'ai besoin d'afficher les 200 colonnes. Je voudrais mapper la classe BigEntity sur les 200 colonnes. Il n'est lié à aucune autre entité, il n'a aucune association.

Question: Avez-vous de l'expérience dans ce domaine? Etes-vous au courant des problèmes qu'aurait Hibernate, comme par exemple dans le cache de premier niveau, la vérification sale et le cycle de vie de l'entité en général?

+1

Bonne question. La migration vers le nouveau cadre peut être une autre raison de cette question. Par exemple. il peut y avoir un système hérité et un nouveau système et les deux devraient fonctionner avec la même base de données. – TomR

Répondre

17

La façon la plus simple de le faire est de mapper des propriétés que vous n'utilisez pas souvent lazy:

<property name="extendedProperty" lazy="true" /> 

... or using Annotations ... 

@Basic(fetch = FetchType.LAZY) 
String getExtendedProperty() { ... } 

Hibernate ne chargerait pas ces propriétés d'abord; à la place, ils seront chargés à la demande (lors de la première utilisation). Vous pouvez forcer Hibernate à charger toutes les propriétés en utilisant la clause fetch all properties dans votre requête HQL.

Un autre scénario possible consiste à mapper réellement deux entités complètement séparées à la même table, mais en créer une immutable. Gardez à l'esprit que sera traité comme une entité différente par Hibernate, le cache de premier/deuxième niveau étant complètement séparé pour les deux (ce qui explique pourquoi l'immuabilité est importante).

Vous PAS être en mesure d'obtenir cette fonctionnalité via la cartographie de l'héritage, car Hibernate toujours retourne un type d'entité réelle et concrète. Jetez un oeil à ma réponse à Hibernate Inheritance Strategy question pour une explication détaillée.

+0

Merci beaucoup pour cette excellente réponse! –

+0

Il semble que la recherche paresseuse des propriétés nécessite une instrumentation bytecode. Est-ce si commun sur les projets? Pour activer le chargement paresseux au niveau de la propriété, vos classes doivent être instrumentées: le bytecode est ajouté à l'original pour activer cette fonctionnalité, veuillez vous référer à la documentation de référence d'Hibernate. Si vos classes ne sont pas instrumentées, le chargement paresseux au niveau de la propriété est ignoré silencieusement. –

+0

Oui, l'instrumentation bytecode est nécessaire pour les propriétés paresseuses, mais il est facile à ajouter pendant la construction (http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html#performance-fetching-lazyproperties). Ce n'est pas très commun (dans mon expérience) parce que le cas d'utilisation des propriétés paresseuses (par opposition aux associations paresseuses) n'est pas si commun mais il n'est pas extrêmement rare non plus. Cela a certainement déjà été fait et est prêt pour la production si c'est ce qui vous préoccupe. – ChssPly76