Java JPA:灵活映射“;属性“;(各种数据类型的键/值数据)到实体

Java JPA:灵活映射“;属性“;(各种数据类型的键/值数据)到实体,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我在决定如何以合理且高效的方式将键/值数据映射到实体时遇到了一些问题。我甚至可能在这里采取了错误的方法,所以我很感谢任何提示 基本上,这是关于将各种公共属性与房地产实体关联,例如: 电梯:是/否(布尔值) 卧室:2间(整数) 家具:[全部|部分|无](“枚举”) 视图:自由格式文本(字符串) 应在运行时定义属性及其数据类型(字符串、bool、整数、“enum”-多个预定义字符串中的一个),即存储在数据库中。属性类型还可能包含用于生成GUI的元数据(int的min/max/stepping等)

我在决定如何以合理且高效的方式将键/值数据映射到实体时遇到了一些问题。我甚至可能在这里采取了错误的方法,所以我很感谢任何提示

基本上,这是关于将各种公共属性与房地产实体关联,例如:

  • 电梯:是/否(布尔值)
  • 卧室:2间(整数)
  • 家具:[全部|部分|无](“枚举”)
  • 视图:自由格式文本(字符串)
应在运行时定义属性及其数据类型(字符串、bool、整数、“enum”-多个预定义字符串中的一个),即存储在数据库中。属性类型还可能包含用于生成GUI的元数据(int的min/max/stepping等)。此外,还应能够高效地查询任何一组键/值组合,即一套有两间以上卧室、无家具、带电梯的公寓

我的方法是从联合继承(简化代码)开始的:

以及每种属性的派生类:

@Entity
public class IntAttribute extends Attribute
{
    public int minvalue;
    public int maxvalue;
    public int stepping;
}

@Entity
public class EnumAttribute extends Attribute
{
    @OneToMany(...)
    public List<EnumAttributeValue> values = new ArrayList<EnumAttributeValue>();
}
@实体
公共类IntAttribute扩展属性
{
公共价值;
公共整数最大值;
公众参与;
}
@实体
公共类枚举属性扩展属性
{
@一个女人(…)
公共列表值=新的ArrayList();
}
我很快就用这种方法碰上了一堵墙,因为EnumAttribute本身除了一系列可能的值之外没有任何属性,这意味着我可能会有一个enum_属性表,其中只包含一个attribute_id,其他什么都不包含。StringAttribute和BooleanAttribute也一样,它们没有任何属性基类中没有的属性

我也不太确定如何将实际的键/值对映射到实体。创建AttributeValue基类,并为每个数据类型创建一个?尝试对实际值执行一个平面表每类层次结构,以便高效搜索


我必须承认,我还没有想法。我知道像MongoDB这样的面向文档的数据库更适合,但遗憾的是,目前还不能这样做

好问题。我很想知道你的解决方案是什么。我目前也在考虑解决这个问题的方法。
@Entity
public class IntAttribute extends Attribute
{
    public int minvalue;
    public int maxvalue;
    public int stepping;
}

@Entity
public class EnumAttribute extends Attribute
{
    @OneToMany(...)
    public List<EnumAttributeValue> values = new ArrayList<EnumAttributeValue>();
}