每个类层次结构的表 - 只获取带有Criteria API的超类,鉴别符不起作用?

时间:2015-05-12 21:48:01

标签: java hibernate hierarchy hibernate-criteria

我有Table per Class层次结构,有3个类,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 {
//
}

Institute,扩展了Academy

@Entity
@Table(name = "institute")
@DiscriminatorValue(value="INSTITUTE")
public class Institute extends Academy{
//
}

课程Department,其中包含Instutute

@Entity
@Table(name = "department")
@DiscriminatorValue(value="DEPARTMENT")
public class Department extends Institute{
//
}

当我保存特定实体时,它看起来没问题 - 例如我看到 discriminator 列。但是当我保存一个Academy,一个Institute和一个Department - 我试图只获得Academies时,我得到3个元素,但我希望只有一个 - 列表不仅包含{{1还有AcademyInstitute。我创建了一个单元测试,显示了我的意思:

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的列表,我觉得没关系在我的问题)。我认为 discriminator 专栏关注区分不同的类实例,如果我为Department创建标准,我将只获得Academies。在使用Academy层次结构时,是否存在仅使用Criteria API获取基类实例的解决方案?

2 个答案:

答案 0 :(得分:0)

由于为每个子类创建了一个新表,因此TABLE_PER_CLASS继承策略不需要@DiscriminatorValue。请注意,当您使用SINGLE_TABLE或JOINED继承策略时,需要使用descriminator。上述案例中的descriminator列有助于在从单个或公共表中获取数据时区分不同的子类。

答案 1 :(得分:0)

我用这种方式解决了这个问题: 因为我需要区分父实体Academy和子实体Institute,所以我决定删除明确的继承。相反,我创建了BaseAcademy继承的Academy类和BaseInstitute继承的Institute。现在,没有“Hibernate”继承,但BaseInstitute类继承自BaseAcademy。我不知道这是不是很好的解决方案,但此时一切正常。