我有一个数据模型,其中许多实体从单个超类实体继承一些公共属性。我在超类上使用InheritanceType.JOINED
,这导致Hibernate为超类中定义的属性创建单个表,子类表只包含由子类添加的列(因此要加载子类实例的属性,在两个表之间执行连接)。这一切都很好。
然而,我想要做的是指定一个唯一约束,其中包括子类和超类表中的字段。例如,假设我的超类实体类似于:
Thing: {id, name}
...然后我有一些子类实体,如:
Company: {address} //inherits 'id' and 'name' from 'Thing'
Employee: {company} //inherits 'id' and 'name' from 'Thing'
...我希望将Hibernate配置为自动强制给定的Company
不能有两个具有相同名称的Employee
。 company
字段位于Employee
表中,但name
字段位于Thing
表中,因此有没有办法让Hibernate强制执行此约束,或者每当我添加新的Employee
时,我都需要以编程方式执行此操作?
答案 0 :(得分:5)
如果在数据库中无法实现,则无法使用Hibernate。你不能用SQL在多个表上创建一个约束,所以在Hibernate中都不能。
您可以通过创建一个仅包含公司和员工ID并在这两个字段上设置唯一约束的新实体来解决此问题,但我建议以编程方式强制执行此操作。
答案 1 :(得分:2)
你可以不使用InheritanceType.JOINED
,然后一切都以一张巨大的表格结束,你可以编写你的约束。如前所述:你想要的只是在关系数据库中是不可能的。