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


ダッシュボードでは、基準の一部として、これらのテーブルの任意の列に基づくレポートをユーザーが表示できるようにする必要があります。そこで、ユーザーの選択に基づいて Hibernate Criteria クエリを生成します。

POJO をリバース エンジニアリングすると、Metric オブジェクトは次のようになります。


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

私がやりたいことは、メトリックを上記のテーブルの関係の単一の POJO として公開することです。したがって、基本的に、Metric POJO を介してサーバーの名前、値、タイムスタンプをすべて取得できます。これは単純に Criteria クエリを生成し、結果セットは常に Metric オブジェクトのリストになります。

このリンクを参照しました。これは、オブジェクト間の 1 対 1 の関係でうまく機能します。しかし、私の場合、メトリックはserver_metricなどと1対多の関係にあります...メトリックテーブルのマッピングファイルが同じことを達成する方法がわかりません

どんな助けでも大歓迎です...
乾杯!!

4

2 に答える 2

1

スキーマにはservermetric(テーブルを介して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 宣言を Server と Metric に追加できます。それが論理的に意味があるかどうかはわかりません。

于 2009-10-01T18:20:02.113 に答える
0

遅すぎるとは思いますが、後に続く人にとっては、IDをプリミティブとしてマップできるとは思えません。

于 2011-02-24T15:43:59.600 に答える