我有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还有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
的列表,我觉得没关系在我的问题)。我认为 discriminator 专栏关注区分不同的类实例,如果我为Department
创建标准,我将只获得Academies。在使用Academy
层次结构时,是否存在仅使用Criteria API获取基类实例的解决方案?
答案 0 :(得分:0)
由于为每个子类创建了一个新表,因此TABLE_PER_CLASS继承策略不需要@DiscriminatorValue
。请注意,当您使用SINGLE_TABLE或JOINED继承策略时,需要使用descriminator。上述案例中的descriminator列有助于在从单个或公共表中获取数据时区分不同的子类。
答案 1 :(得分:0)
我用这种方式解决了这个问题:
因为我需要区分父实体Academy
和子实体Institute
,所以我决定删除明确的继承。相反,我创建了BaseAcademy
继承的Academy
类和BaseInstitute
继承的Institute
。现在,没有“Hibernate”继承,但BaseInstitute
类继承自BaseAcademy
。我不知道这是不是很好的解决方案,但此时一切正常。