2

Hibernate を介してデータベースにデータを保存する Java アプリケーションを開発しています。

このアプリケーションの機能の 1 つは、型などのテンプレートを再利用のために定義することです。たとえば、タイプには属性があり、属性の値を持つタイプのインスタンスを作成できます。

問題は、タイプが定義する属性の値のみを割り当てることができるようにする方法がわからないことです。私のソリューションには、問題の原因となる冗長性がありますが、それを削除する方法がわかりません。

私の現在の(そして問題のある)アプローチは次のようになります。

@Entity
class Type
{
    @Id
    @Generated
    private Long id;

    @OneToMany(mappedBy="type")
    private List<Attribute> attributes;

    //...
}

@Entity
class Attribute
{
    @Id
    @Generated
    private Long id;

    @ManyToOne
    private Type type;

    //...
}

@Entity
class Instance
{
    @Id
    @Generated
    private Long id;

    @ManyToOne
    private Type type;

    //...
}

@Entity
class AttributeValue
{

    @Id
    @Embedded
    private ResourceAttributValueId id;

    @Column(name="val")
    private String value;

    //...
}

@Embeddable
public class ResourceAttributValueId implements Serializable
{
    @ManyToOne
    private ResourceStateImpl resource;

    @ManyToOne
    private ResourceAttributeImpl attribute;

    //...
}

タイプの定義は冗長です: タイプは AttributeValue->Attribute->Type および AttributeValue->Instance->Type 経由で到達できます

別のアイデアは、タイプ + 属性名を属性の id として使用し、インスタンス + 属性名を属性値の id として使用することでしたが、それは私の問題を解決しません。

4

1 に答える 1

2

このような「ひし形」の依存関係を正しくモデル化するための鍵は、関係を識別するための使用法です。

ここに画像の説明を入力してください

(私はあなたのエンティティの名前を少し自由に変更しました。これは、より一貫性のある命名スキームであると私は信じています。)

ダイアモンドの上部から両側を下に移動し、下部まで移動して、そこでマージする方法に注意してください。したがって、フィールドは1つだけで、両方のFKに関係しているため、属性タイプのタイプがインスタンスのタイプと異なる属性インスタンスを持つことはできません。TYPE_IDATTRIBUTE_INSTANCE.TYPE_ID

これにより「不一致」属性は回避されますが、アプリケーションレベルで最適に適用される属性インスタンスの存在は保証されません(「必須属性」の概念をサポートしている場合)。理論的には、循環遅延FKを使用してデータベースレベルで適用できますが、すべてのDBMSがそれをサポートしているわけではなく、ORMでうまく機能するとは思えません。

残念ながら、私はHibernateについて十分な経験がなく、これをそこにマッピングできるかどうか、そしてどのようにマッピングできるかについて答えています。

参照:

于 2012-09-10T11:29:21.873 に答える