我们在应用程序中使用 Hibernate/JPA、Spring、Spring Data 和 Spring Security。我有一个User
使用 JPA 映射的标准实体。此外,我有一个UserRepository
public interface UserRepository extends CrudRepository<User, Long> {
List<User> findByUsername(String username);
}
它遵循 Spring Data 命名查询方法的约定。我有一个实体
@Entity
public class Foo extends AbstractAuditable<User, Long> {
private String name;
}
我想使用 Spring Data 审计支持。(如此处所述。)因此,我创建了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 Data CrudRepository
。然后StackOverflowError
抛出一个,因为调用findByUsername
似乎触发休眠以将数据刷新到数据库,这触发AuditingEntityListener
谁调用AuditorService#getCurrentAuditor
再次触发刷新等等。
如何避免这种递归?是否有加载User
实体的“规范方式”?或者有没有办法防止 Hibernate/JPA 刷新?