1

我有配置对象。

Config {
  String a;
  int b;
....
}

Config2 {
  Double c;
....
}

由于系统中只有一个配置对象,我想存储为行。

所有属性名称作为键

key  value   type
a    test    config
b    123     config
aa   11.11   config2

有没有办法在 JPA 中做到这一点?存储此类对象的最佳模式是什么?

4

2 回答 2

1

您可以通过多种方式实现此目的,这是一个示例

@Entity
@Table(name = "YOURTABLE")
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("config")
Config {
  @Id
  String key;
  @Column(name = "type")
  String type;
  @Transient 
  String a;
  @Transient 
  int b;
  ....
  @Column(name ="value")
  String value ;

  initType ()
  {
    // assume either a or b contain value
    value = a == null || a.isEmpty() ? String.valueOf(a) : a;
  }
}

@Entity
@Table(name = "YOURTABLE")
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("config2")
Config2 {

  @Id
  String key;
  @Column(name = "type")
  String type;
  @Transient
  Double c;
  @Column(name ="value")
  String value ;
  ....
  initType ()
  {
    value = String.valueOf(c);
  }
}
于 2012-11-23T18:45:06.700 回答
0

您可以尝试创建一个属性实体,然后让 Config 和 Config2 包含可以从属性列表或工厂构建自己的方法。

List<Property> configPropeties = entityManager.createQuery("select p from Property p where p.type='config'").getResultList();
Config config = new Config();
for(Property p: configProperty) {
  if (p.key == "a")
    config.a = P.value;
..

您可能可以使用反射使其更加通用,因为键将是对象中的一个属性,并且查询中使用的类型可以从类名中确定。持久化更改需要反转过程并将属性合并到 entityManager 中。属性将需要使用键和类型的复合 pk。

于 2012-11-23T23:15:32.483 回答