हम अपने आवेदन में हाइबरनेट/जेपीए, स्प्रिंग, स्प्रिंग डेटा और स्प्रिंग सिक्योरिटी का उपयोग करते हैं। मेरे पास मानक User
इकाई है जो जेपीए का उपयोग करके मैप किया गया है। इसके अलावा, मैं एक UserRepository
स्प्रिंग डेटा जेपीए और स्प्रिंग सिक्योरिटी के साथ ऑडिटरवेयर को कैसे कार्यान्वित करें?
public interface UserRepository extends CrudRepository<User, Long> {
List<User> findByUsername(String username);
}
जो क्वेरी तरीकों के नामकरण के लिए स्प्रिंग डाटा सम्मेलन इस प्रकार की है। मेरे पास एक इकाई है
@Entity
public class Foo extends AbstractAuditable<User, Long> {
private String name;
}
मैं स्प्रिंग डेटा ऑडिटिंग समर्थन का उपयोग करना चाहता हूं।
@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
एक स्प्रिंग डाटा CrudRepository
है बनाने के लिए: (। Descripe here के रूप में) इसलिए मैं एक AuditorService
इस प्रकार बनाया। StackOverflowError
को findByUsername
पर कॉल करने के बाद से डेटाबेस को डेटा फ्लश करने के लिए हाइबरनेट को ट्रिगर करने लगता है जो को ट्रिगर करता है जो AuditorService#getCurrentAuditor
को कॉल करता है जो फिर से फ्लश को ट्रिगर करता है और इसी तरह।
इस रिकर्सन से कैसे बचें? User
इकाई को लोड करने के लिए कोई "कैननिकल तरीका" है? या क्या हाइबरनेट/जेपीए को फ्लश करने से रोकने का कोई तरीका है?
किसी भी उपयोगकर्ता को फिर से क्यों हटाएं? क्यों हटाया या sth के रूप में चिह्नित नहीं है। – aycanadal