动态设置鉴别器值(Hibernate映射)

时间:2016-07-31 12:13:25

标签: java hibernate orm hibernate-mapping discriminator

我有一个像这样的场景

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TANDC_TYPE", discriminatorType = DiscriminatorType.STRING, length = 32)
@Table(name = "T_TERMS_AND_CONDITIONS", schema = DataSourceConfig.PERSISTENCE_SCHEMA_NAME)
public class TermsAndConditions {
...
}

它的儿童班具有鉴别价值" CREATOR"

@Entity
@DiscriminatorValue("CREATOR")
public class AccountTermsAndConditions extends TermsAndConditions {
...
}

另一个具有鉴别器值的子类" ORDER"

@Entity
@DiscriminatorValue("ORDER")
public class OrderTermsAndConditions extends TermsAndConditions {
...
}

在这里,我的要求是促进一种名为" USER"的新型帐户的条款和条件映射。这与我的AccountTermsAndConditions

有关

现在,我不想再为帐户类型添加一个课程" USER" (类似于UserTermsAndConditon)作为" CREATOR"和"用户"与账户类型有关。

我需要一个可能的解决方案来将我的鉴别器值设置为' CREATOR'或者'用户'根据账户类型。

有没有办法根据条件在类中设置我的鉴别器值?

我也看过oracle的文档,其中说明了:

  

"如果未指定DiscriminatorValue注释且a   使用鉴别器列,特定于提供者的功能   用于生成表示实体类型的值。"

如何继续实施?

请帮帮我。

1 个答案:

答案 0 :(得分:1)

您可能想要利用的是@DiscriminatorFormula,因为您正在使用单表继承。有了这个,我们可以将CREATORUSER类型映射到CREATOR,以便重用相同的java类类型。

@DiscriminatorFormula(
  "case when TANDC_TYPE = 'ORDER' then 'ORDER' " +
  "else ( " +
  "  case when TANDC_TYPE in ('CREATOR','USER') then 'CREATOR' " +
  "  else 'Unknown' " +
  "  end ) " +
  "end "
 )

我可能会建议将AccountTermsAndConditions判别器更改为ACCOUNT,然后将CREATORUSER映射到上述SQL片段中的ACCOUNT以保持一致。

您可以详细了解@DiscriminatorFormula here

相关问题