【问题标题】:Setting discriminator value dynamically (Hibernate mappings)动态设置鉴别器值(休眠映射)
【发布时间】:2016-07-31 12:13:24
【问题描述】:

我有这样的场景

@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”和“USER”都与帐户类型相关。

我需要一个可能的解决方案来根据帐户类型将我的鉴别器值设置为“CREATOR”或“USER”。

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

我还看到了 oracle 的文档,其中指出:

"如果没有指定 DiscriminatorValue 注释并且一个 使用鉴别器列,提供者特定的功能将是 用于生成表示实体类型的值。”

如何进行实施?

请帮帮我。

【问题讨论】:

    标签: java hibernate orm hibernate-mapping discriminator


    【解决方案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,然后将上述SQL 片段中的CREATORUSER 映射到ACCOUNT 以保持一致性。

    你可以阅读更多关于@DiscriminatorFormulahere的信息。

    【讨论】:

    • 在这里,我想根据用户类型的检查使用“CREATOR”或“USER”。对于“CREATOR”和“USER”,我不想将 TANDC_TYPE 作为“CREATOR”。那可能吗 ?类似 if(userType.equals("CREATOR") { db.setTandCType("CREATOR"); } else {db.setTandCType("USER"); }
    • 如果您希望您的代码影响这一点,我看不出为什么您不能使用 USER 的新鉴别器值扩展 AccountTermsAndConditions 而没有其他字段。
    • 谢谢。工作!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2013-05-20
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多