在View或DTO解决方案中打开会话

时间:2012-01-24 18:18:47

标签: spring session jsf transactionscope

我想知道这个配方是不是在View或Dozer工作中使用Open Session(场景是spring,jsf,hibernate应用程序):

我在后端模块中有这个:

public abstract class AbstractMap<E extends Serializable> implements Mapper<E>  {

    public abstract E map(E e) ;

        public List<E> map(List<E> l) {

        List<E> map = new ArrayList<E>();
        for (E t : l) {
            map.add(this.map(t));
        }
        return map;
    }
}

@Component
public class PersonService extends AbstractService<Person>{

    @Autowired
    PersonDAO personDao;

    @Transacted
    public List<Person> findPeople(Mapper<Person> m, PersonFilter filter) {

        return m.map(personDao.findByFilter(filter));
    }   
}

在前端我有这个jsb bean:

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

    @Autowired
    PersonService personService;

    PersonFilter personFilter;

    List<Person> getPeople() {

     return personService.findPeople(new AbstractMap<People>() {

     public Person map(Person person) {

             Person dto = new Person();
             dto.setName(person.getName());
             dto.setAddresses(new AbstractMap<Address>() {

                public Address map(Address a) {

                    Address dto = new Address();
                    dto.setStreet(a.getStreet());
                    return dto;
                }
             }.map(person.getAddresses()));

         return dto;
        }
        }, personFilter);
    }
}

从我的观点来看有一些优点:

  • 前端必须指示它要将每个调用都检索到后端。
  • 如果需要在多个地方使用映射器,我可以将地图代码移动到外部类。
  • 后端开启和关闭交易。
  • 不需要重复的代码来定义人员和地址的DTO。

可能导致此建议解决方案的问题是什么?

0 个答案:

没有答案