Мы используем @Configurable от Spring (вместе с обычным оператором new), который работает как шарм. Не более моделей анемичных доменов . Наконец, это гораздо более объектно-ориентированный дизайн, не так ли:
Person person = new Person(firstname, lastname);
// weird
peopleService.save(person);
// good (save is @Transactional)
person.save();
Mail mail = new Mail(to, subject, body);
// weird
mailService.send(mail);
// good (send is @Transactional)
mail.send();
Мы не сравнивали производительность. До сих пор мы просто не чувствовали в этом необходимости.
РЕДАКТИРОВАТЬ: вот как будет выглядеть класс:
@Configurable("person")
public class Person {
private IPersonDAO _personDAO;
private String _firstname;
private String _lastname;
// SNIP: some constructors, getters and setters
@Transactional(rollbackFor = DataAccessException.class)
public void save() {
_personDAO.save(this);
}
@Transactional(readOnly = true)
public List<Role> searchRoles(Company company) void{
return _personDAO.searchRoles(this, company);
}
// it's getting more interesting for more complex methods
@Transactional(rollbackFor = DataAccessException.class)
public void resignAllRoles(Company company) {
for (Role role : searchRoles(company)) {
role.resign();
}
}
}
// the implementation now looks like this
personService.getPerson(id).resignAllRoles(company);
// instead of this
roleService.resignAll(personService.searchRoles(personService.getPerson(id), company));
И это конфигурация Spring:
<context:spring-configured />
<bean id="person" class="org.example.model.Person" lazy-init="true">
<property name="personDAO" ref="personDAO" />
</bean>
Примечание: как вы видите, до сих пор существуют службы, например, для поиска объектов (personService.getPerson (id)), но все методы, которые работают с переданным объектом (например, person), перемещаются в этот класс сам (т.е. person.save () вместо personService.save (person)). Сам метод остается тем же и работает с любым нижележащим уровнем доступа к данным (чистый JDBC, Hibernate, JPA, ...). Он просто переместился туда, где и должен.