EclipseLink,懒惰的提取集合可以在事务之外访问

时间:2013-01-16 21:22:42

标签: jpa 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文档声明,默认情况下,ManyToMany关联的fechtype是lazy。这告诉我,当在服务方法中加载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;
    }
}

1 个答案:

答案 0 :(得分:5)

只要上下文仍然可用,EclipseLink就可以获取延迟关系,如下所述:https://forums.oracle.com/forums/thread.jspa?messageID=1706796