Весенняя сделка в JSF - PullRequest
       341

Весенняя сделка в JSF

0 голосов
/ 23 марта 2012

Использование Spring 3.1, Mojarra, Hibernate

applicationContext.xml

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    ... 
    </bean>     

    <tx:annotation-driven  />

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <context:component-scan base-package="mypackage"/>

TestBean.java

@Component
@Scope("session")
public class TestBean {

@Autowired private @Getter @Setter HibernateTemplate hibernateTemplate=null;

public String submit(){
    try{
        this.test();
    }catch (RuntimeException ex) {
        FacesUtil.addWarn("Error");
    }

    return null;
}

@Transactional
public String test() {

    Device d1=new Device();
    hibernateTemplate.persist(d1);

    if(1==1)
        throw new RuntimeException("Testing");

    Device d2=new Device();
    hibernateTemplate.persist(d2);
    return null;
}

}

Это работает (откат), но показывает исключение в браузере

<h:commandButton value="Submit" action="#{testBean.test}"/>

Пытался показать сообщение лиц, но это фиксирует d1

<h:commandButton value="Submit" action="#{testBean.submit}"/>

Вызов транзакционного метода другого компонента (DAO) тоже работает, но я хотел бы иметь код в самом управляемом компоненте. Как мне обрабатывать транзакции в JSF?

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Либо переместите транзакционные методы на еще один слой, либо используйте TransactionTemplate, если вы хотите по какой-то причине избежать этого:

0 голосов
/ 23 марта 2012

Лучше перейти на многоуровневую архитектуру Сервис и уровень DAO, напрямую обрабатывая транзакции в управляемом бине, что противоречит цели принципа единой ответственности класса.

Назначение управляемого объекта Bean должно быть предназначено для обработки навигации и шлюза для данных от уровня представления к уровню обслуживания, где вы можете выполнять основную бизнес-логику или вариант использования и делегировать сохранение данных на уровне DAO.

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

Таким образом, все становится более управляемым, обслуживаемым и проверяемым. Смоделируйте свой сервисный уровень, протестируйте DAO на предмет сохранности данных и Managed Bean для уровня представления.

Spring использует прокси / AOP для магического @Transactional, и его лучше кодировать для взаимодействия, так как у него есть свои проблемы, если вы не пишете код для интерфейса, т.е. прямой прокси для интерфейса или подкласса CGLIB для инъекции. Ищите в документации теги для настройки прокси, чтобы лучше понять, что я имею в виду под кодом для интерфейса.

Примечание: HibernateTemplate считается Anti Pattern и удален из поддержки Hibernate 4 только указателем, поэтому вы можете действовать соответствующим образом, если в Hibernate 3.

Надеюсь, это поможет !!!!!

...