2010-05-27 5 views
1

J'ai une question concernant une ArrayList de nombres entiers, ou des types primitifs en général. Supposons que je conçois un programme POS et que chaque produit puisse avoir plusieurs prix. Supposons que je puisse représenter une valeur de prix avec int s et dans la classe Product je dois le champ ArrayList<Integer> prices. Quelle est la meilleure façon de mapper cela avec Hibernate?ArrayList de types primitifs dans Hibernate

Je pourrais le mapper à une table product_prices avec un champ contenant la valeur de prix et un champ pour la clé étrangère référençant le produit en question, mais cela semble exagéré. D'autre part, je pourrais concaténer tous les prix dans un String et le stocker comme un champ dans le tableau products, avec les prix séparés par des points-virgules, par exemple. De cette façon, je suis en train d'enregistrer une table et un avenir select, mais il ne semble pas tout à fait OO.

Quel est le meilleur endroit pour faire ici?

Répondre

5

D'autre part, je ne pouvais concaténer tous les prix dans une chaîne et le stocker sous forme un champ dans la table des produits, avec les prix séparés par des points-virgules, par exemple. De cette façon, je suis en train d'enregistrer une table et une sélection future, mais il ne semble pas tout à fait OO.

Non, ce n'est pas relationnel. Cela brise les règles pour la première forme normale.

Je ne vois pas pourquoi vous vous inquiétez de l'enregistrement d'une table et un SELECT. C'est l'optimisation prématurée à son pire.

Un produit peut avoir plusieurs prix, mais il y aura également des critères qui vous indiquent quand il s'applique (par exemple, la date d'entrée en vigueur, les conditions d'actualisation, etc.) Vous devez également les ajouter à votre schéma.

Je recommanderais une table de produit, sans aucune information de prix ou d'escompte dedans. Il semble qu'il y aurait une relation plusieurs-à-plusieurs entre les produits et les prix si Price avait une date d'entrée en vigueur, donc vous auriez aussi une table Product_Price JOIN.

+0

Ok, merci, tout ce que vous avez dit a beaucoup de sens. – Pin

8

Oublions ici l'échantillon (qui ne peut être le meilleur). Avec Hibernate, vous pouvez mapper une collection de types ou d'objets embeddedable avec l'annotation @CollectionOfElements (et éventuellement un @IndexColumn des collections ordonnées):

@Entity 
public class Product { 
    @Id @GeneratedValue 
    private Long id; 

    @CollectionOfElements @IndexColumn(name="price_index") 
    private List<Integer> prices = new ArrayList<Integer>(); 

    ... 
} 

sémantiquement, c'est proche d'un @OneToMany sauf que les éléments de la collection ne sont pas des entités, ils n'ont pas de propriété id et leur cycle de vie dépend entièrement de l'objet propriétaire.

D'un point de vue de la base de données, cela se traduirait par une table pour le produit et une table pour les prix:

 
create table Product (id bigint not null, primary key (id)) 
create table Product_prices (Product_id bigint not null, element integer, price_index integer not null, primary key (Product_id, price_index)) 
alter table Prodcut_prices add constraint FK9D26D06FB343359D foreign key (Product_id) references Product 

JPA 2.0, cette annotation a été normalisée préfèrent donc le nouveau @ElementCollection annotation si vous utilisez JPA 2.0.Cela étant dit, pour le cas particulier du produit et du prix, ce que @duffymo a dit est très vrai et ils ne devraient probablement pas être mis en œuvre en utilisant les annotations mentionnées ci-dessus.

+0

Je pense que cette solution a ses mérites. Tous les types énumérés ne doivent pas avoir leur propre table dans la base de données, et la différence d'effort nécessaire pour ajouter une annotation '@ ElementConnection' plutôt que de refactoriser l'énumération pour être une Entité appropriée, puis remplir sa table avec les valeurs requises peut être significatif. – aroth

+0

Cette solution implique une table supplémentaire dans la base de données Product_prices. La vraie question est de savoir comment faire cela sans cette table supplémentaire dans les situations qui conviennent, bien sûr. –

Questions connexes