我正在尝试为自行开发的解决方案创建一个仪表板,该解决方案收集应用程序服务器的本机性能相关统计信息。这是各个代理收集的数据的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 ...
我想要做的是将Metric公开为上面这些表关系的单个POJO。因此,基本上您可以通过Metric POJO获取服务器的名称,值,时间戳。这将简单地生成Criteria查询,结果集将始终是Metric对象的列表。
我提到了这个link - 它可以很好地用于对象之间的一对一关系。但在我的情况下,度量与server_metric有一对多的关系等等......我不确定我的Metric表的映射文件是如何实现相同的
任何帮助将不胜感激...
干杯!!
答案 0 :(得分: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声明添加到Server和Metric;我不确定这在逻辑上是否合理。
答案 1 :(得分:0)
我确定现在为时已晚,但对于任何人来说,我不相信你可以将Id映射为原语。