Table 每个 Class 层次结构 - 仅获取具有条件 API 的超类,鉴别器不起作用?
Table per Class hierarchy - get only Superclass with Criteria API, discriminator not working?
我有 Table per Class
层次结构,有 3 个 classes,Academy
:
@Entity
@Table(name = "academy")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(
name="hibernate_hierarchy_discriminator",
discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue(value="ACADEMY")
public class Academy {
//
}
Class Institute
,它扩展了 Academy
:
@Entity
@Table(name = "institute")
@DiscriminatorValue(value="INSTITUTE")
public class Institute extends Academy{
//
}
和 class Department
,它扩展了 Instutute
:
@Entity
@Table(name = "department")
@DiscriminatorValue(value="DEPARTMENT")
public class Department extends Institute{
//
}
当我保存特定实体时,它看起来还不错 - 例如我看到 discriminator 列。但是当我保存一个 Academy
、一个 Institute
和一个 Department
- 我试图只获得学院时,我得到了 3 个元素,但我希望只有一个 - 列表不仅包含 Academy
还有 Institute
和 Department
。我创建了一个单元测试来说明我的意思:
@Test
@Transactional
public void test_WhenOneAcademyIsSaved_OneAcademyShouldBeRead() throws Exception {
//tables are empty before test
final Academy academy = new Academy("Michigan", "Main street");
getCurrentSession().save(academy);
final Institute institute = new Institute("Michigan", "Main street", "IT", "C", academy);
getCurrentSession().save(institute);
getCurrentSession().save(new Department("Michigan", "Main street", "IT", "C", "333 333 333", "Programming", institute));
List<Academy> academies = (List<Academy>)getCurrentSession()
.createCriteria(Academy.class)
.list();
assertEquals(1, academies.size()); //size is 3
}
(这也是树结构,Academy
有一个Instutute
的列表,Institute
有一个Department
的列表,但我认为确实如此在我的问题中无关紧要)。我认为 discriminator 专栏关心区分不同的 class 实例,如果我为 Academy
创建标准,我将只获得学院。当使用 Table per Class
层次结构时,是否有解决方案可以仅获取具有 Criteria API 的基础 class 实例?
您不需要 @DiscriminatorValue
用于 TABLE_PER_CLASS 继承策略,因为为每个子 class 创建了一个新的 table。请注意,当您使用 SINGLE_TABLE 或 JOINED 继承策略时,描述符是必需的。 cases 上方的 descriminator 列有助于 hibernate 在从单个或公共 table.
获取数据时区分不同的子 classes
我是这样解决的:
因为我需要区分父实体 Academy
和子实体 Institute
我决定删除显式继承。相反,我创建了 BaseAcademy
class Academy
继承的 BaseInstitute
和 Institute
继承的 BaseInstitute
。现在,没有 "Hibernate" 继承,但是 BaseInstitute
class 继承自 BaseAcademy
。我不知道这是否是好的解决方案,但此时一切正常。
我有 Table per Class
层次结构,有 3 个 classes,Academy
:
@Entity
@Table(name = "academy")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(
name="hibernate_hierarchy_discriminator",
discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue(value="ACADEMY")
public class Academy {
//
}
Class Institute
,它扩展了 Academy
:
@Entity
@Table(name = "institute")
@DiscriminatorValue(value="INSTITUTE")
public class Institute extends Academy{
//
}
和 class Department
,它扩展了 Instutute
:
@Entity
@Table(name = "department")
@DiscriminatorValue(value="DEPARTMENT")
public class Department extends Institute{
//
}
当我保存特定实体时,它看起来还不错 - 例如我看到 discriminator 列。但是当我保存一个 Academy
、一个 Institute
和一个 Department
- 我试图只获得学院时,我得到了 3 个元素,但我希望只有一个 - 列表不仅包含 Academy
还有 Institute
和 Department
。我创建了一个单元测试来说明我的意思:
@Test
@Transactional
public void test_WhenOneAcademyIsSaved_OneAcademyShouldBeRead() throws Exception {
//tables are empty before test
final Academy academy = new Academy("Michigan", "Main street");
getCurrentSession().save(academy);
final Institute institute = new Institute("Michigan", "Main street", "IT", "C", academy);
getCurrentSession().save(institute);
getCurrentSession().save(new Department("Michigan", "Main street", "IT", "C", "333 333 333", "Programming", institute));
List<Academy> academies = (List<Academy>)getCurrentSession()
.createCriteria(Academy.class)
.list();
assertEquals(1, academies.size()); //size is 3
}
(这也是树结构,Academy
有一个Instutute
的列表,Institute
有一个Department
的列表,但我认为确实如此在我的问题中无关紧要)。我认为 discriminator 专栏关心区分不同的 class 实例,如果我为 Academy
创建标准,我将只获得学院。当使用 Table per Class
层次结构时,是否有解决方案可以仅获取具有 Criteria API 的基础 class 实例?
您不需要 @DiscriminatorValue
用于 TABLE_PER_CLASS 继承策略,因为为每个子 class 创建了一个新的 table。请注意,当您使用 SINGLE_TABLE 或 JOINED 继承策略时,描述符是必需的。 cases 上方的 descriminator 列有助于 hibernate 在从单个或公共 table.
我是这样解决的:
因为我需要区分父实体 Academy
和子实体 Institute
我决定删除显式继承。相反,我创建了 BaseAcademy
class Academy
继承的 BaseInstitute
和 Institute
继承的 BaseInstitute
。现在,没有 "Hibernate" 继承,但是 BaseInstitute
class 继承自 BaseAcademy
。我不知道这是否是好的解决方案,但此时一切正常。