Wie die Umsetzung AuditorAware mit Spring Data JPA und Spring Security?

Verwenden wir Hibernate/JPA, Spring, Spring Data und Spring Security in unserer Anwendung. Ich habe eine standard - User Person, die abgebildet wird, die mit JPA. Weiter habe ich eine UserRepository

public interface UserRepository extends CrudRepository<User, Long> {
    List<User> findByUsername(String username);
}

folgt der Frühling-Daten-Konvention für die Benennung von Methoden Abfragen. Ich habe eine Entität

@Entity
public class Foo extends AbstractAuditable<User, Long> {
    private String name;
}

Will ich mit Spring Data auditing-support. (Als descripe hier.) Daher erstellte ich eine AuditorService wie folgt:

@Service
public class AuditorService implements AuditorAware<User> {

    private UserRepository userRepository;

    @Override
    public User getCurrentAuditor() {
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        List<User> users = userRepository.findByUsername(username);
        if (users.size() > 0) {
            return users.get(0);
        } else {
            throw new IllegalArgumentException();
        }
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

Wenn ich eine Methode erstellen

@Transactional
public void createFoo() {
    Foo bar = new Foo(); 
    fooRepository.save(foo);
}

Wo alles ist richtig verkabelt und FooRepository eine Feder befindet, die Daten CrudRepository. Dann ein StackOverflowError geworfen wird, da der Aufruf findByUsername auszulösen scheint hibernate Spülen, um die Daten zur Datenbank, die Trigger AuditingEntityListener wer ruft AuditorService#getCurrentAuditor was wiederum löst einen flush und so weiter.

Wie Sie vermeiden, diese Rekursion? Gibt es eine "kanonische Weg" laden die User Entität? Oder gibt es eine Möglichkeit zu verhindern, Hibernate/JPA von der Spülung?

InformationsquelleAutor gregor | 2013-01-08
Schreibe einen Kommentar