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.