Hibernate: получить запись, но она обновляется в базе данных? - PullRequest
0 голосов
/ 24 декабря 2010

По какой-то причине Hibernate, кажется, сохраняет мой сеанс открытым и обновляет объект, а я явно не вызываю save / update / saveorupdate.Я предполагаю, что сессия остается открытой, и она помечена как грязная.

Однако это не желаемое поведение, так каков самый чистый способ исправить это?

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

Мой поток: перейти к jsp => controller => service => dao

DAOgetter function

if(userId != 0) {
   return (User)dbFactory.get(User.class, userId);
}
return null;

Служба просто передает ее в контроллер, и контроллер помещает объект User в область запроса.Я отображаю его на своей странице JSP, используя EL.

edit: я добавил следующее: JSP:

<spring:bind path = "user.telephoneNumber">${user.telephoneNumber}</spring:bind>

Контроллер:

@InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(String.class, "telephoneNumber", new TelephoneNumberEditor(false));
    }

Редактор: public classTelephoneNumberEditor расширяет PropertyEditorSupport {private boolean isRequired = false;

public TelephoneNumberEditor(boolean isRequired) {
    this.isRequired = isRequired;
}

public void setAsText(String text) throws IllegalArgumentException {
   String s = null;
    if (!this.isRequired && StringUtils.isBlank(text)) {
        setValue("");
    }
    else
    {
        s = text.replace("(0)","");
        s = s.replaceAll("[^0-9]", "");
        setValue(s);
    }
}

public String getAsText() {
    String telephoneNumber = (String) getValue();
    if(StringUtils.isBlank(telephoneNumber)){
        return "";
    } else {
        try {
            MaskFormatter formatter = new MaskFormatter("+AA AA AA AA AA");
            formatter.setValueContainsLiteralCharacters(false);
            return formatter.valueToString(telephoneNumber);
        } catch (ParseException e) {
            return "";
        }
    }
}

}

И в контроллере я помещаю объект User в область запроса как пользователь.

Ответы [ 2 ]

1 голос
/ 24 декабря 2010

Вы можете создать другое свойство (получатель и установщик) для отформатированного значения и пометить его как переходное (с помощью @Transient или опустить его в вашем .hbm.xml):

@Transient
public String getFormattedPhoneNumber() { ... }
public void setFormattedPhoneNumber(String number) { ... }

В качестве альтернативы выможно настроить тип доступа Hibernate для работы с полями вместо свойств - в этом случае ваши получатели могут возвращать произвольные представления.

РЕДАКТИРОВАТЬ: Если вы используете привязку данных Spring MVC, вы можете реализовать свою логику форматированияв PropertyEditor.Поскольку форматирование номера телефона является проблемой при представлении, перемещение его на уровень представления выглядит разумно:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String.class, "phoneNumber", 
        new PropertyEditorSupport() { ... });
}

. При таком подходе настраиваемый редактор работает автоматически в типичном цикле Spring from processing (форма отображается с Теги пружинной формы и данные привязываются к @ModelAttribute после POST).Если вам нужно отобразить форматированное значение вручную (вне тегов формы), вы можете использовать <spring:bind>:

<spring:bind path = "user.phoneNumber">${status.displayValue}</spring:bind>

(или без user., если внутри <form:form>, Iдумаю)

0 голосов
/ 24 декабря 2010

Если вы хотите внести непостоянные изменения в постоянный объект, вы можете явно исключить его из контекста с помощью Session.evict(Object object). Hibernate не сохранит никаких изменений, которые вы внесете в него после того, как это будет сделано.

Что-то в описании того, почему это происходит, не совсем складывается. Вы используете постоянный доступ на основе свойств, а не прямые геттеры? Получатель, который отмечает значение, может вызвать архитектурные возражения, но сам по себе не должен вызывать проблем с постоянством.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...