2015-10-05 6 views
0

У меня проблема: когда я сохраняю свой объект в БД, он работает нормально, но когда я хочу получить его из БД, он не работает. Я использую selectItemsConverter из Omnifaces 1.8.3 (я пробовал с 1.10 тоже)SelectItemsConverter Omnifaces, предварительно выбранный из базы данных

AutomacaoEmail.java

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

... 

@ManyToOne(fetch = FetchType.EAGER) 
private ModeloEmail modeloEmail; 

... 

@Override 
public int hashCode() { 
    int hash = 7; 
    hash = 31 * hash + Objects.hashCode(this.id); 
    return hash; 
} 

@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    final AutomacaoEmail other = (AutomacaoEmail) obj; 
    if (!Objects.equals(this.id, other.id)) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return String.format("%s[id=%d]", getClass().getSimpleName(), getId()); 
} 

loadFromDatabaseMethod()

List<ModeloEmail> modelosTemp = modeloEmailFacade.buscarTodos(); 
    SelectItemsBuilder selectItemsBuilder = new SelectItemsBuilder(); 
    if (modelosTemp != null) { 
     for (ModeloEmail modeloEmail : modelosTemp) { 
      selectItemsBuilder.add(modeloEmail, modeloEmail.getNome()); 
     } 
     modelosEmails = selectItemsBuilder.buildList(); 
    } 

page.xhtml

<p:selectOneMenu value="#{automacaoEmailsController.automacaoEmail.modeloEmail}" converter="omnifaces.SelectItemsConverter"> 
    <f:selectItem noSelectionOption="true" itemLabel="Selecionar um modelo"/> 
    <f:selectItems value="#{automacaoEmailsController.modelosEmails}"/> 
</p:selectOneMenu> 

Я пробовал с SelectItemsIndexConverter тоже.

ответ

2
if (getClass() != obj.getClass()) { 
    return false; 
} 

Этот тест в методе equals() может произойти сбой при obj является реализация JPA конкретный прокси-класс, например, используемый для Hibernate, например, ленивые сущности. Это, по крайней мере, объясняет, почему это «иногда» работает.

Если вы действительно используете спящий режим, то вам нужно заменить выше испытание ниже теста:

if (Hibernate.getClass(this) != Hibernate.getClass(obj)) { 
    return false; 
} 

Или по ниже более общего (не Hibernate-зависимый) тест:

if (!(obj.getClass().isAssignableFrom(getClass()) && getClass().isAssignableFrom(obj.getClass()))) { 
    return false; 
} 
+0

Я использую eclipselink. в моем случае он никогда не работает. Это не сработало с предлагаемой модификацией. –

+0

Тогда проблема не отображается в представленной до сих пор информации. Какой сервер? Какая версия PF? Что, если вы замените 'noSelectionOption =" true "' на 'itemValue =" # {null} "'? Что, если вы замените '' на ''? – BalusC

+0

Im помощью: -Glassfish сервер 4.x -pF 4.0.21 Я уже удалил эту строку: '<е: SelectItem noSelectionOption = "истинный" itemLabel = "Selecionar гм Modelo"/>' не работал. Я изменил на '' .. did not work. Я пробовал: 'Список ', 'Список ', 'SelectItem []' ..didnt work. никаких ошибок не возникает. Я помещаю inputText рядом с «select», и значение отображается правильно. Я создал метод для подзарядки значений и обновления формы, но не работал. Я воссоздал таблицы в базе данных, а также создал пустую страницу только с данным компонентом. Не работал. –

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

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