【发布时间】:2012-12-22 19:36:58
【问题描述】:
我们在应用程序中使用 Hibernate/JPA、Spring、Spring Data 和 Spring Security。我有一个使用 JPA 映射的标准 User 实体。此外,我有一个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 审计支持。 (如描述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 Data CrudRepository。然后抛出StackOverflowError,因为对findByUsername 的调用似乎触发休眠以将数据刷新到数据库,这触发AuditingEntityListener 调用AuditorService#getCurrentAuditor 再次触发刷新等等。
如何避免这种递归?是否有“规范方式”来加载 User 实体?或者有没有办法防止 Hibernate/JPA 刷新?
【问题讨论】:
标签: spring hibernate jpa spring-security spring-data