Вопрос: EclipseLink, коллекция ленивых изъятий доступна вне транзакции


У меня есть объект с именем 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, Я обращаюсь к этому role поле вне транзакции, которое использовалось для загрузки User организация. Я ожидал получить ошибку, потому что в документации eclipselink указано, что по умолчанию fechtype для ассоциации ManyToMany ленивый , Это говорит мне, что когда 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;
    }
}

4


источник


Ответы:


EclipseLink позволяет получать ленивые отношения до тех пор, пока контекст все еще доступен, как описано здесь: https://forums.oracle.com/forums/thread.jspa?messageID=1706796


5