2009-10-01 5 views
1

Я пытаюсь создать панель управления для доморощенного решения, которое собирает статистику производительности серверов приложений. Вот DDL для данных, которые были собраны различными агентами. Для краткости я пропустил несколько столбцов и таблиц, не относящихся к ним.Нужна помощь при сопоставлении спящего режима




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) 
); 


Приборная панель должна позволять пользователям просматривать отчеты, основанные на любой колонке (ы) из этих таблиц в рамках критериев. Поэтому я буду генерировать запрос Критерии Гибернации, основанный на выборе пользователя.

Когда я реверс инженерии POJO метрический объект выглядит примерно так:


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

То, что я хотел бы сделать, это выставить Metric в качестве единственного POJO для отношений этих таблицах выше. Таким образом, вы можете получить имя сервера, значение, метку времени через Metric POJO. Это будет просто генерация запросов Criteria, а набор результатов всегда будет списком объектов Metric.

Я упомянул об этом link - который отлично подходит для взаимно-однозначной взаимосвязи между объектами. Но в моем случае метрика имеет отношение один к многим с server_metric и т. Д. Я не уверен, как мой файл сопоставления для таблицы Metric будет выглядеть так, чтобы достичь того же

Любая помощь будет оценена по достоинству ...
Приветствия!

ответ

1

Ваша схема имеет связь «много-ко-многим» между server и metric (через таблицу server_metric), которая сама по себе имеет дополнительные атрибуты (набор значений). Hibernate не поддерживает таких много-ко-многим отображений, так что вы будете иметь, чтобы разложить их на многие-к-одному отображений вместо:

@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(); 
} 

Вы можете добавить соответствующие объявления @OneToMany к серверу и Метрика, если вы хотите ассоциации должны быть двунаправленными; Я не уверен, что это имеет смысл логически.

+0

Не уверен, что это правильно. Согласно книге Java Persistence with Hibernate (стр. 303) существует два способа добавления столбцов для объединения таблиц. Я протестировал с аннотацией @Embedded (второй подход, указанный в книге), и он отлично работает. –

0

Я считаю, что вы можете найти свой ответ here

ура!

0

Я уверен, что это слишком поздно, но для тех, кто придет после, я не верю, что вы можете сопоставить Id как примитив.