使用@Inheritance和两次相同的@DiscriminatorValue时,依靠JPA使用子类

时间:2014-10-21 07:33:16

标签: java hibernate jpa inheritance discriminator

我有以下实体:

@Entity
@Inheritance
@DiscriminatorColumn(name = "TYPE")
@DiscriminatorValue("Company")
public class Company {
    ... (lot of attributes)
}

@Entity
@DiscriminatorValue("Company")
public class LargeCompany extends Company {
    ... (a few not required attributes)
}

公司实体位于一个单独的项目中,应该是可扩展的(通常只有一个子类)。

默认情况下,当我使用@Inheritance时,JPA只创建一个包含Company和所有子类的所有属性的表。要分离所有这些不同类型的实例JPA 使用@DiscriminatorValue,每个类通常都不同。

我意识到如果我对两个类(实体)使用相同的@DiscriminatorValue,它不会导致问题。这样可以更容易使用:

separat项目可以负责创建公司并存储它们(UI,验证等)。在下一步中,我的项目可以加载这些公司而不需要 我获得LargeCompany对象的另一个步骤。

我通过几个集成测试验证了这是否有效(当entityManager被清除时),但我不确定我是否真的可以依赖这个“功能”?可能有更好的方法吗?

顺便说一下。我正在使用hibernate 4.2.0


其中一项工作测试:

@Test
public void test() {
    Company company = new Company("TEST");
    em.persist(company);
    em.flush();
    em.clear();     // required!!

    company = em.createQuery("from Company").getFirstResult();
    assertEquals(LargeCompany.class, company.getClass());
}

1 个答案:

答案 0 :(得分:0)

您是否尝试将一个应用程序中的一个对象转换为另一台应用程序中的另一个对象?在这种情况下,它会工作。如果我们谈论它的背景,在后端(在DB中)它创建一列用于区分行,并且该行根据该区分值形成特定的Java对象。由于您在访问相同DB的两个应用程序中使用相同的区分值,因此它实际上将对象从一个应用程序传输到另一个应用程序但是,如果您尝试在单个应用程序中使用相同的区分值,那么您将遇到麻烦。首先,它应该给出错误,如果它没有给出错误,那么它在你不知情的情况下将你的一个对象转换成另一个对象。因此,在同一应用程序中使用时要小心。