Идентификатор управляемого объекта Hibernate сбрасывается после пересылки в новый ActionClass - PullRequest
0 голосов
/ 07 сентября 2011

У меня есть приложение Struts 1.3 и Hibernate 3.1, которое использует шаблон открытого сеанса в поле зрения для поддержки транзакций гибернации. После того как я выполняю session.save () для объекта, его идентификатор устанавливается в объекте, однако после того, как я передаю объект в новый класс действия, все свойства, которые управляются hibernate, как и идентификатор объекта, устанавливаются ноль.

Клиент не использует Spring, поэтому мне пришлось написать собственную реализацию фильтра запросов шаблона, которая выглядит следующим образом:

//get a transaction from JTA
transaction = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");

        transaction.begin();

        // Call the next filter (continue request processing)
chain.doFilter(request, response);

// Commit and cleanup
log.finer("Committing the database transaction");
transaction.commit();

Мой SaveActionClass вызывает служебный слой для сохранения объекта, и связанный с ним список (где я контролирую сеанс) выглядит следующим образом:

this.saveAddresses(vendor); //saves a persistant set to the database via dao

this.saveExpCodes(vendor, expCodes); //saves a persistant set to the database  via dao

this.savePhoneNumbers(vendor); //saves a persistant set to the database  via dao

vendor.save(); //saves the vendor object to the database via dao

session.flush();  

session.refresh(vendor);

После сохранения объекта vendor объект vendor и все его дочерние объекты имеют действительные идентификаторы. Затем объект вендора добавляется в свойство DynActionForm, а затем пересылается в ViewActionClass:

dynaActionForm.set(VENDOR_PROPERTY_NAME, vendor);

return actionMapping.findForward(target); //viewvendor

Затем в ViewActionClass, когда я получаю свойство vendor, все идентификаторы устанавливаются в нуль:

Vendor vendor = (Vendor)dynaActionForm.get(VENDOR_PROPERTY_NAME); //vendorid is now null

Почему персистентный объект теряет свои идентификаторы при передаче из одного класса действия в другой через свойство в dynActionForm?

1 Ответ

0 голосов
/ 14 сентября 2011

Сложность заключалась в размещении session.refresh () в методе службы getVendor:

public Vendor getVendor(Vendor vendor, Boolean refresh) {
    Session session = HibernateUtil.getSession();

    session.setFlushMode(FlushMode.MANUAL);

        //refreshing the session here before the get call gave me the would still set some properties to null
        /*
        if(refresh.booleanValue()){
        session.refresh(vendor);
    }
    */

    vendor = vendor.get();

        //however putting the refresh here, after the get() call populated the vendor object properly
    if(refresh.booleanValue()){
        session.refresh(vendor);
    }
        ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...