我有配置对象。
Config {
String a;
int b;
....
}
Config2 {
Double c;
....
}
由于系统中只有一个配置对象,我想存储为行。
所有属性名称作为键
key value type
a test config
b 123 config
aa 11.11 config2
有没有办法在 JPA 中做到这一点?存储此类对象的最佳模式是什么?
我有配置对象。
Config {
String a;
int b;
....
}
Config2 {
Double c;
....
}
由于系统中只有一个配置对象,我想存储为行。
所有属性名称作为键
key value type
a test config
b 123 config
aa 11.11 config2
有没有办法在 JPA 中做到这一点?存储此类对象的最佳模式是什么?
您可以通过多种方式实现此目的,这是一个示例
@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);
}
}
您可以尝试创建一个属性实体,然后让 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。