Wir verwenden Spring @Configurable (zusammen mit regulären neuen Operator), die wie ein Charme funktioniert. Nicht mehr anemic domain models. Schließlich ist dies viel mehr objektorientierten Design, nicht wahr:
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();
Wir haben keinen Performance-Vergleich obwohl getan. Bislang haben wir das einfach nicht für nötig gehalten. Und das ist der Frühling Config
@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));
:
<context:spring-configured />
<bean id="person" class="org.example.model.Person" lazy-init="true">
<property name="personDAO" ref="personDAO" />
</bean>
Hinweis:
EDIT: das ist, wie die Person Klasse aussehen würde, wie Sie sehen, gibt es Dienste noch um, zum Beispiel um nach Objekten zu suchen (personService.getPerson (id)), aber alle Methoden, die an einem übergebenen Objekt (z. B. einer Person) arbeiten, werden selbst in diese Klasse verschoben (d. h. person.save() anstelle von personService.save (person)). Die Methode selbst bleibt die gleiche und arbeitet mit jeder zugrunde liegenden Datenzugriffsebene (reine JDBC, Hibernate, JPA, ...). Es hat sich einfach dorthin bewegt, wo es hingehört.
http://stackoverflow.com/questions/2091749/domain-driven-design-and-transactions-in-spring-environment – Bozho