2

ちょっと変わったデザインに出くわしましたが、どうやって扱うのかよくわかりません。マップしようとしているテーブルは次のようになります。

TABLE example {
    ID INT,
    CATEGORY VARCHAR,
    PROPERTY VARCHAR,
    VALUE VARCHAR);

1つのIDに複数の行を含めることができます(明らかに、主キーではありません)。例として、次のようになります。

# ID  CATEGORY     PROPERTY VALUE
  1   general_info name     order 1
  1   general_info date     1/1/2009
  ...

すべてのIDには、いくつかの異なるカテゴリがあります。プロパティ名は、特定の(id、category)の組み合わせに対して一意です。

(編集)IDフィールドは、別のテーブル内のオブジェクトへの外部キーです。IDフィールドのみを使用して、これらのオブジェクトからこのテーブルに格納されているさまざまなプロパティにアクセスできる必要があります。複合キーが進むべき道である場合、どうすればそれらをリンクできますか?

(EDIT2)また、ここで欠落している詳細は、列1の同じIDを持つすべてのデータが概念的に同じオブジェクトに属していることだと思います。(ID、CATEGORY)の組み合わせごとに個別のインスタンスは必要ありません。

明らかに、これはあまり正規化されていません。最悪のシナリオでは、正規化されてすべてをコピーする追加のテーブルをいくつか設定しましたが、この情報を休止状態のバックアップオブジェクトに直接取得するための賢明な方法を誰かが提案できるかどうか疑問に思いました。必要に応じて、Stringプロパティのある種のバッグに入れます。

ところで、hibernate-annotationsを使用しています。

4

2 に答える 2

2

ID、CATEGORY、PROPERTYの複合キーを使用します。休止状態の複数のキーを参照してください。およびJPA-これを実装する方法の例のエンティティ設計の問題(@EmbeddedIdが鍵です!)

于 2010-08-27T15:18:51.720 に答える
1

IDは別のテーブルへの外部キーであるため(そのテーブルを「コンテナ」と呼びましょう)、これは複合キーを持つマップとしてマップできます。

例:

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

マッピング:

<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>
于 2010-08-29T11:08:21.703 に答える