Relacja między typem, atrybutem, instancją i wartością

Zajmuję się tworzeniem aplikacji Java, która przechowuje swoje dane poprzez Hibernate w bazie danych.

Jedną z cech tej aplikacji jest zdefiniowanie szablonów takich jak typy itp. Do ponownego użycia. Na przykład typ ma atrybuty i można tworzyć wystąpienia typu, który ma wartości dla atrybutów.

Problem polega na tym, że nie wiem, jak zapewnić, że można przypisywać tylko wartości atrybutów, które definiuje typ. W moim rozwiązaniu występuje nadmiarowość powodująca problem, ale nie wiem, jak go usunąć.

Moje obecne (i problematyczne) podejście wygląda tak:

@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;

    //...
}

Definicja typu jest zbędna: Typ można uzyskać poprzez AttributeValue-> Attribute-> Type i AttributeValue-> Instance-> Type

Innym pomysłem było użycie nazwy atrybutu type + jako id atrybutu i instancji + nazwa atrybutu jako id wartości atrybutu, ale to nie rozwiązuje mojego problemu.

questionAnswers(1)

yourAnswerToTheQuestion