アプリケーションでは、Hibernate / JPA、Spring、Spring Data、およびSpringSecurityを使用します。JPAを使用してマッピングされる標準User
エンティティがあります。さらに、私はUserRepository
public interface UserRepository extends CrudRepository<User, Long> {
List<User> findByUsername(String username);
}
これは、クエリメソッドの命名に関するSpringDataの規則に従います。私は実体を持っています
@Entity
public class Foo extends AbstractAuditable<User, Long> {
private String name;
}
SpringData監査サポートを使用したい。(ここで説明します。)したがって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
おり、 SpringDataである場合CrudRepository
。次に、への呼び出しが休止状態をトリガーしてデータベースにデータをフラッシュするようStackOverflowError
に見えるため、aがスローされます。これにより、 who呼び出しがトリガーされ、再びフラッシュがトリガーされます。findByUsername
AuditingEntityListener
AuditorService#getCurrentAuditor
この再帰を回避する方法は?User
エンティティをロードするための「標準的な方法」はありますか?または、Hibernate / JPAがフラッシュするのを防ぐ方法はありますか?