首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Hibernate中映射每项多行对象

在Hibernate中映射每项多行对象
EN

Stack Overflow用户
提问于 2010-08-27 23:09:23
回答 2查看 3.6K关注 0票数 2

我遇到了一些,呃,非正统的设计,我不太确定如何处理它。我试图映射的表如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
TABLE example {
    ID INT,
    CATEGORY VARCHAR,
    PROPERTY VARCHAR,
    VALUE VARCHAR);

单个id可以有几行(显然,不是主键)。例如,它可能如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
# ID  CATEGORY     PROPERTY VALUE
  1   general_info name     order 1
  1   general_info date     1/1/2009
  ...

每个ID可能有几个不同的类别。属性名称对于任何给定的(id,类别)组合都是唯一的。

(编辑) ID字段是不同表中对象的外键。我需要能够从这些对象中获取存储在这个表中的各种属性,只使用ID字段。如果组合键是可行的,那么如何将它们链接起来呢?

(EDIT2)我还认为您在这里遗漏的细节是,第一列中具有相同ID的所有数据在概念上属于同一对象。我不希望每个(ID,类别)组合都有一个单独的实例。

显然,这并不是非常规范化。最坏的情况是,我设置了一些额外的表,这些表被标准化并复制所有内容,但我想知道是否有人能提出一个明智的方法,将这些信息直接放入hibernate支持的对象中?如果需要,可以放在某种字符串属性包中。

顺便说一下,我使用的是hibernate注释。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-29 19:08:22

由于该ID是另一个表的外键(让我们将该表称为“容器”),因此可以将其映射为具有组合键的Map。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
public class Container {
    private int id;
    private Map<Key,String> values = new HashMap<Key,String>();

    public String getValue(String category, String property) {
        return values.get(new Key(category, property));
    }

    public void setValue(String category, String property, String value) {
        values.put(new Key(category, property), value);
    }

    public static class Key {
        private String category;
        private String property;

        public Key(String cat, String prop) {
            category = cat;
            property = prop;
        }

        public String getCategory() {
            return category;
        }

        public String getProperty() {
            return property;
        }

        @Override
        public boolean equals(Object obj) {
            if (!(obj instanceof Key)) {
                return false;
            }
            Key k = (Key)obj;
            return category.equals(k.category) && property.equals(k.property);
        }

        @Override
        public int hashCode() {
            return 37*category.hashCode() + property.hashCode();
        }
    }
}

映射:

代码语言:javascript
代码运行次数:0
运行
复制
<class name="Container" table="container">
    <id column="ID" name="id">
        <generator class="native"/>
    </id>
    <map cascade="all-delete-orphan" name="values" table="example">
        <key column="ID"/>
        <composite-map-key class="Container$Key">
            <key-property name="category" type="string" column="CATEGORY"/>
            <key-property name="property" type="string" column="PROPERTY"/>
        </composite-map-key>
        <element type="string" column="VALUE"/>
    </map>
</class>
票数 1
EN

Stack Overflow用户

发布于 2010-08-27 23:18:52

使用具有ID、类别和属性的组合键。有关如何实现此功能的示例,请参阅Multiple key in hibernate how to?JPA - Entity design problem (@EmbeddedId是关键!)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3585540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档