4

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が怠惰であると記載されているため、エラーが発生することを期待していました。これは、エンティティがサービスメソッドにロードされたときに、が自動的にロードされるべきではないことを示しています。roleUserUserroles

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;
    }
}
4

1 に答える 1

5

EclipseLink では、 https ://forums.oracle.com/forums/thread.jspa?messageID=1706796 で説明されているように、コンテキストがまだ利用可能である限り、遅延関係をフェッチできます。

于 2013-01-17T12:02:41.600 に答える