JPA将属性存储为行

时间:2012-11-23 18:19:53

标签: java database design-patterns jpa

我有配置对象。

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

Config2 {
  Double c;
....
}

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

所有属性名称为键

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

有没有办法在JPA中执行此操作?存储此类对象的最佳模式是什么?

2 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分: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。