Java 类型、属性、实例和值之间的关系

Java 类型、属性、实例和值之间的关系,java,hibernate,database-design,Java,Hibernate,Database Design,我正在开发一个Java应用程序,它通过Hibernate将数据存储在数据库中 该应用程序的一个功能是定义模板,如类型等,以便重用。例如,该类型具有属性,您可以创建具有属性值的类型的实例 问题是,我不知道如何确保只能为类型定义的属性赋值。在我的解决方案中,存在导致问题的冗余,但我不知道如何消除它 我目前的(也是有问题的)方法如下所示: @实体 类类型 { @身份证 @产生 私人长id; @OneToMany(mappedBy=“type”) 私有列表属性; //... } @实体 类属性 { @身

我正在开发一个Java应用程序,它通过Hibernate将数据存储在数据库中

该应用程序的一个功能是定义模板,如类型等,以便重用。例如,该类型具有属性,您可以创建具有属性值的类型的实例

问题是,我不知道如何确保只能为类型定义的属性赋值。在我的解决方案中,存在导致问题的冗余,但我不知道如何消除它

我目前的(也是有问题的)方法如下所示:

@实体
类类型
{
@身份证
@产生
私人长id;
@OneToMany(mappedBy=“type”)
私有列表属性;
//...
}
@实体
类属性
{
@身份证
@产生
私人长id;
@许多酮
私有类型;
//...
}
@实体
类实例
{
@身份证
@产生
私人长id;
@许多酮
私有类型;
//...
}
@实体
类属性值
{
@身份证
@嵌入
私有ResourceAttributeValueId;
@列(name=“val”)
私有字符串值;
//...
}
@可嵌入
公共类ResourceAttributeValueId实现可序列化
{
@许多酮
私有资源状态impl资源;
@许多酮
私有ResourceAttributeImpl属性;
//...
}
这里类型的定义是冗余的:可以通过AttributeValue->Attribute->type和AttributeValue->Instance->type访问类型


另一个想法是使用类型+属性名称作为属性的id,使用实例+属性名称作为属性值的id,但这并不能解决我的问题。

正确建模“菱形”依赖项的关键是使用标识关系:

(我随意对您的实体稍加重命名,我认为这是一个更为一致的命名方案。)

请注意,我们是如何将
TYPE_ID
从菱形的顶部、两侧向下一直迁移到底部,然后将其合并到那里的。因此,由于只有一个
ATTRIBUTE\u INSTANCE.TYPE\u ID
字段,并且这两个FK都涉及到该字段,因此我们永远不会有属性类型与实例类型不同的属性实例

虽然这避免了“不匹配”属性,但仍然不能确保属性实例的存在(如果您支持“必需属性”的概念),这最好在应用程序级别实施。从理论上讲,您可以使用循环延迟FKs在数据库级别强制执行它,但并非所有DBMS都支持这一点,我怀疑它是否能很好地与ORMs配合使用

不幸的是,我对Hibernate没有足够的经验来回答它是否可以映射到那里以及如何映射

另见:


迁移和合并主键似乎是解决此类问题的数据库级解决方案。老实说,自从我使用Hibernate以来,我已经忘记了选择正确主键的力量。事实上,Hibernate目前不支持使用“重叠”外键,所以我花了一段时间找到了一个Hibernate可以接受且不太“脏”的解决方案。如果有人对它感兴趣,我会把它贴出来。