Нужна помощь с Hibernate Mapping - PullRequest
1 голос
/ 01 октября 2009

Я пытаюсь создать панель мониторинга для собственного решения, которое собирает собственную статистику производительности серверов приложений. Вот 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)
);


Панель инструментов должна позволять пользователям просматривать отчеты на основе любых столбцов из этих таблиц как часть критериев. Поэтому я сгенерирую запрос Hibernate Criteria на основе выбора пользователя.

Когда я обращаюсь к спроектированному POJO, объект Metric выглядит примерно так:


private long id;
private String name;
private Set serverMetrics = new HashSet(0);<br/>

... constructors, getters, setters truncated ...

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

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

Буду признателен за любую помощь ...
Ура !!

Ответы [ 2 ]

1 голос
/ 01 октября 2009

Ваша схема имеет связь «многие ко многим» между 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 голосов
/ 24 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...