2016-07-31 13 views
1

У меня есть сценарий что-то вроде этогоНастройка значение дискриминатора динамически (отображения Hibernate)

@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 { 
... 
} 

Другой класс ребенок, имеющий значение дискриминатора «ЗАКАЗ»

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

Здесь мое требование заключается в том, чтобы облегчить использование Условий и Кондити ons для нового типа учетной записи, называемого «USER», который связан с моим AccountTermsAndConditions.

Теперь я не хочу добавлять еще один класс для типа учетной записи «ПОЛЬЗОВАТЕЛЬ» (что-то вроде UserTermsAndConditon), так как «СОЗДАТЕЛЬ» и «ПОЛЬЗОВАТЕЛЬ» относятся к типам учетных записей.

Мне нужно решение здесь, чтобы установить значение дискриминатора для «CREATOR» или «USER» в зависимости от типа учетной записи.

Есть ли способ установить значение дискриминатора внутри класса на основе условий?

Я также видел документацию оракула, который гласит:

«Если аннотация DiscriminatorValue не указана и используются столбец дискриминатора, функция поставщика конкретного будет использоваться для генерирования значения, представляющее тип сущности. "

Как я могу продолжить реализацию?

Пожалуйста, помогите мне.

ответ

1

Похоже, что вы можете использовать рычаги @DiscriminatorFormula, так как вы используете однонаправленное наследование таблицы. При этом мы можем сопоставить как CREATOR, так и USER типам 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, а затем карту CREATOR и USER к ACCOUNT в приведенном выше фрагменте SQL для последовательности.

Вы можете узнать больше о @DiscriminatorFormulahere.

+0

Здесь я хочу использовать «CREATOR» или «USER» на основе проверки типа пользователя. Я не хочу, чтобы TANDC_TYPE был «CREATOR» для «CREATOR» и «USER». Это возможно ? Что-то вроде if (userType.equals («CREATOR») {db.setTandCType («CREATOR»);} else {db.setTandCType («USER»);} – user3152686

+0

Если вы хотите, чтобы ваш код повлиял на это, я не вижу причин, почему вы тогда просто не можете расширять 'AccountTermsAndConditions' новым значением дискриминатора для' USER' без дополнительных полей. – Naros

+0

Спасибо. – user3152686

 Смежные вопросы

  • Нет связанных вопросов^_^