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

时间:2011-08-16 00:28:58

标签: java hibernate jpa orm

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

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

  • 电梯:是/否(布尔)
  • 卧室:2(整数)
  • 家具:[完整|部分|无](“enum”)
  • view:自由格式文本(字符串)

属性及其数据类型(字符串,bool,整数,“枚举” - 多个预定义字符串中的一个)应在运行时定义,即存储在数据库中。属性类型还可能包含用于生成GUI的元数据(int的最小/最大/步进等)。此外,应该可以有效地查询任何一组键/值组合,即具有超过2间卧室的公寓,没有家具,带有电梯。

我使用连接继承(简化代码)开始了我的方法:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Attribute
{
    @Id
    public int attribute_id;
    public String name;
    public int type;
}

和每种属性的派生类:

@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>();
}

由于EnumAttribute除了可能的值列表之外没有任何属性,因此我很快就会遇到这种方法,这意味着我可能只有一个enum_attribute表,其中只包含一个attribute_id而没有其他内容。与StringAttribute和BooleanAttribute相同,它们没有任何属性基类中的属性。

我也不太确定如何将实际的键/值对映射到实体。为每种数据类型创建一个AttributeValue基类和一个?尝试使用平坦的TABLE_PER_CLASS层次结构来获得有效搜索的实际值?

我必须承认,我的想法很新鲜。我知道像MongoDB这样的面向文档的数据库会更合适,但遗憾的是,目前这不是一个选项。

0 个答案:

没有答案