2009-10-01 6 views
1

J'essaie de créer un tableau de bord pour une solution locale qui recueille les statistiques liées aux performances natives des serveurs d'applications. Voici le DDL pour les données collectées par divers agents. J'ai omis quelques colonnes et des tables non pertinentes pour la brièveté.Besoin d'aide pour le mappage Hibernate




create table server (
    id    integer not null auto_increment, 
    name    varchar(50) not null, 

    primary key(id) 
); 

create table metric (
    id    integer not null auto_increment, 
    name    varchar(50) not null, 

    primary key (id) 
); 

create table server_metric (
    id    integer not null auto_increment, 
    server_id  integer not null, 
    metric_id  integer not null, 

    constraint foreign key (server_fk) references server(id), 
    constraint foreign key (metric_fk) references metric(id), 

    primary key (id) 
); 

create table value (
    id    integer not null auto_increment, 
    server_metric_id  integer not null, 
    value    varchar(500) not null, 
    collect_time   timestamp not null, 

    constraint foreign key (server_metric_fk) references server_metric(id) 
    primary key (id) 
); 


Le tableau de bord devrait permettre aux utilisateurs de visualiser des rapports basés sur une colonne (s) à partir de ces tableaux dans le cadre des critères. Je vais donc générer une requête Hibernate Criteria basée sur la sélection de l'utilisateur.

Quand j'Engineered inverse POJO, l'objet métrique ressemble à quelque chose comme ceci:


private long id; 
private String name; 
private Set serverMetrics = new HashSet(0);
... constructors, getters, setters truncated ...

Ce que je voudrais faire est d'exposer métrique comme POJO unique pour la relation de ces tableaux ci-dessus. Donc, essentiellement, vous pouvez obtenir le nom du serveur, la valeur, l'horodatage à travers le POJO métrique. Cela créera simplement la génération de requêtes Critères et l'ensemble de résultats sera toujours une liste d'objets métriques.

Je me suis référé à ce link - qui fonctionnerait bien pour une relation bi-univoque entre objets. Mais dans mon cas, la métrique a de un à plusieurs relations avec server_metric et ainsi de suite ... Je ne suis pas sûr de savoir comment mon fichier de mapping pour la table de métrique aurait l'air d'atteindre la même


Cheers !!

Répondre

1

Votre schéma a une association plusieurs-à-plusieurs entre server et metric (via la table server_metric) qui possède en elle-même des attributs supplémentaires (collection de valeurs). Mise en veille prolongée ne prend pas en charge ces nombreux à plusieurs applications, de sorte que vous devrez les décomposer en plusieurs-à-un mappings au lieu:

@Entity 
public class Server { 
    // id, name getters/setters 
} 

@Entity 
public class Metric { 
    // id, name getters/setters 
} 

@Entity 
public class ServerMetric { 
    // id 

    @ManyToOne 
    public Server getServer(); 

    @ManyToOne 
    public Metric getMetric(); 

    @OneToMany(mappedBy = "serverMetric") 
    public List<Value> getValues(); 
} 

@Entity 
public class Value { 
    // id, value, collect_time 

    @ManyToOne 
    public ServerMetric getServerMetric(); 
} 

Vous pouvez ajouter des déclarations de @OneToMany appropriées au serveur et métrique si vous voulez les associations doivent être bidirectionnelles; Je ne suis pas sûr que cela ait un sens logique.

+0

Je ne sais pas si c'est correct. Selon le livre Java Persistence with Hibernate (page 303), il existe deux façons d'ajouter des colonnes pour joindre des tables. J'ai testé avec l'annotation @Embedded (deuxième approche répertoriée dans le livre) et cela fonctionne parfaitement. –

0

Je crois que vous pouvez trouver votre réponse here

acclamations!

0

Je suis sûr que c'est trop tard, mais pour ceux qui viennent après, je ne crois pas que vous pouvez mapper un Id comme primitif.