我有配置对象。
Config {
String a;
int b;
....
}
Config2 {
Double c;
....
}
由于系统中只有一个配置对象,我想存储为行。
所有属性名称为键
key value type
a test config
b 123 config
aa 11.11 config2
有没有办法在JPA中执行此操作?存储此类对象的最佳模式是什么?
答案 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。