Как сохранить выбранную сущность в форме редактирования / сохранения? - PullRequest
1 голос
/ 17 ноября 2011

В настоящее время я изучаю Java EE с использованием JBoss, и я застрял в одной простой проблеме.Хотя это должно быть распространенным явлением, я не нашел решения в Интернете.

Я хочу отобразить список контактов, и если контакт выбран, открывается страница сведений и информация о контакте может быть отредактирована.

Контакт является организацией JPA.Создание новых контактов и отображение списка контактов и страницы сведений работает нормально.Однако у меня возникают проблемы при обновлении контактной информации.

Если щелкнуть контакт, я открываю страницу сведений и передаю идентификатор в качестве параметра get.Теперь выполняется следующий код JSF:

<f:metadata>
  <f:viewParam name="contactID" value="#{contactUpdate.contactID}" />
</f:metadata>


<h:form>
  <h:outputLabel for="firstName" value="First Name:" />
  <h:inputText id="firstName" value="#{contactUpdate.contact.firstName}" />
  <h:commandButton id="register" action="#{contactUpdate.updateContact()}" value="Update" />
</h:form>

Это боб (удален метод получения и установки):

@Stateful
@Named
@RequestScoped
public class ContactUpdate {

@Inject
private EntityManager em;

private Contact contact;
private long contactID;


public void updateContact(){
    EntityTransaction transaction = em.getTransaction();
    transaction.begin();
    transaction.commit();
}

public void setContactID(long contactID) {
    this.contactID = contactID;

    setContact(em.find(Contact.class, contactID));
}

}

Если я обновлю его, контакт будет null.Я предполагаю, что область запроса слишком коротка и уже очищена.Можно ли установить contactID при коммите?

Я думал, что можно будет также использовать @ViewScoped, но при этом <f:viewParam> больше не работает.

1 Ответ

1 голос
/ 17 ноября 2011

Поскольку вы готовите контакт в установщике параметра представления, вам необходимо передать идентификатор контакта обратно в качестве параметра запроса, чтобы компонент с областью запроса мог подготовить его должным образом:

<h:commandButton id="register" action="#{contactUpdate.updateContact()}" value="Update">
    <f:param name="contactID" value="#{contactUpdate.contactID}" />
</h:commandButton>

НоЛучше было бы , а не выполнять какую-либо бизнес-логику в установщиках (и определенно также не в получателях ) и использовать вместо нее <f:event type="preRenderView">.Таким образом, @ViewScoped будет работать должным образом.

См. Также:

...