Как проверить, существует ли запись внешнего ключа? - PullRequest
3 голосов
/ 25 декабря 2011

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

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

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

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

1 Ответ

4 голосов
/ 25 декабря 2011

Что вам нужно, это 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.

...