User
次のフィールドを持つという名前のエンティティがありますroles
:
@ManyToMany
@JoinTable(
name = "user_role",
joinColumns = {@JoinColumn(name = "user_id", nullable = false)},
inverseJoinColumns = {@JoinColumn(name = "role_id", nullable = false)}
)
private List<Role> roles;
サービスメソッドを使用してビアをロードするUser
と、サービスメソッドはトランザクション(JTA)にラップされます。サービスメソッドを呼び出してを取得した後、エンティティの読み込みに使用されたトランザクションの外部でUser
このフィールドにアクセスします。eclipselinkのドキュメントには、デフォルトでは、ManyToManyアソシエーションのfechtypeが怠惰であると記載されているため、エラーが発生することを期待していました。これは、エンティティがサービスメソッドにロードされたときに、が自動的にロードされるべきではないことを示しています。role
User
User
roles
roles
トランザクションの外部にアクセスできたのはなぜですか?roles
怠惰ではなく熱心にフェッチされたように見えるのはなぜですか?
ユーザーをロードするサービスクラスは次のとおりです(質問に関係のないコードをいくつか削除しました)。
@Service
@Transactional(rollbackFor = ServiceException.class)
public class UserServiceImpl implements UserService {
@Autowired(required = true)
private UserRepository userRepository;
@Override
public User authenticate(String username, String password) throws ServiceException {
//Get the user
List<User> users = userRepository.findByUsername(username);
if (users == null || users.isEmpty() || users.size() > 1) {
return null;
}
User user = users.get(0);
String hash = getHash(password, user.getSalt());
return StringUtils.equals(hash, user.getPassword()) ? user : null;
}
}