需要帮助Hibernate Mapping

时间:2009-10-01 17:59:25

标签: hibernate hibernate-mapping

我正在尝试为自行开发的解决方案创建一个仪表板,该解决方案收集应用程序服务器的本机性能相关统计信息。这是各个代理收集的数据的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表的映射文件是如何实现相同的

任何帮助将不胜感激...
干杯!!

2 个答案:

答案 0 :(得分: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;我不确定这在逻辑上是否合理。

答案 1 :(得分:0)

我确定现在为时已晚,但对于任何人来说,我不相信你可以将Id映射为原语。