Как проверить, существует ли запись внешнего ключа?

У меня есть внешний ключ внутри моей таблицы Customer.

@JoinColumn(name = "DISCOUNT_CODE", referencedColumnName = "DISCOUNT_CODE")
@ManyToOne(optional = false)
private DiscountCode discountCode;

У меня есть форма, которая содержит все поля этой таблицы (включая внешний ключ discountCode и его описание из другой таблицы).

Я хочу иметь возможность показать сообщение о том, что этот внешний ключ не существует, если пользователь вводил вход, который не существует в таблице внешнего ключа. Когда я нахожу это поле, я возвращаю его описание из таблицы. Как я могу показать сообщение об ошибке недопустимого поля, когда пользователь его выгружает, и он не существует в таблице?

Ответ 1

Вам нужно Validator. Он должен выглядеть следующим образом:

@ManagedBean
@RequestScoped
public class DiscountCodeValidator implements Validator {
    @EJB
    private MrBean mrBean;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String discountCode = (String) value;

        if (!mrBean.checkDiscountCodeExistence(discountCode)) {
            throw new ValidatorException(new FacesMessage("This code is not valid!"));
        }
    }
}

В вашем .xhtml файле вы можете объявить этот валидатор следующим образом:

<h:inputText id="discountCode" value="#{someBean.discountCode}" 
             validator="#{discountCodeValidator}" 
             required="true" requiredMessage="Discount code is required.">
   <f:ajax event="blur" render="discountMsg" />
</h:inputText>
<h:message for="discountCode" id="discountMsg"/>

Следует отметить, что я предполагаю, что вы должны ввести EJB, чтобы проверить наличие кода скидки с помощью функции checkDiscountCodeExistence(). Следовательно, я аннотировал вышеуказанный валидатор как @ManagedBean. Если вам не нужно вводить какие-либо EJB, вы можете аннотировать Validator с помощью @FacesValidator.