我們在我們的應用程序中使用Hibernate/JPA,Spring,Spring Data和Spring Security。我有一個使用JPA映射的標準User
實體。另外,我有一個UserRepository
如何用Spring Data JPA和Spring Security實現AuditorAware?
public interface UserRepository extends CrudRepository<User, Long> {
List<User> findByUsername(String username);
}
隨後命名查詢方法春節數據約定。我有一個實體
@Entity
public class Foo extends AbstractAuditable<User, Long> {
private String name;
}
我想使用Spring Data審計支持。 (正如descripe here)因此,我創建了一個AuditorService
如下:
@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;
}
}
當我創建一個方法
@Transactional
public void createFoo() {
Foo bar = new Foo();
fooRepository.save(foo);
}
當一切都正確有線和FooRepository
是一個Spring數據CrudRepository
。然後StackOverflowError
由於findByUsername
調用似乎觸發休眠刷新數據到數據庫觸發AuditingEntityListener
誰調用AuditorService#getCurrentAuditor
再次觸發刷新等等。
如何避免這種遞歸?有沒有一種「規範的方式」來加載User
實體?或者有沒有辦法阻止Hibernate/JPA刷新?
爲什麼要刪除一個用戶呢?爲什麼不標記爲刪除或某事。 – aycanadal