0

我有以下实体:

@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 不会引起问题。这将使它更容易使用:

分离项目可以负责创建公司并存储它们(UI、验证等)。在下一步中,我的项目可以加载这些公司,而无需额外的步骤,我将获得 LargeCompany 对象。

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

顺便提一句。我正在使用休眠 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());
}
4

1 回答 1

0

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

于 2014-10-21T08:00:12.007 回答