当前位置: 首页 > 知识库问答 >
问题:

EclipseLink,惰性获取集合可在事务之外访问

冀冯浩
2023-03-14

我有一个名为User的实体,它具有以下名为角色的字段:

@ManyToMany
@JoinTable(
        name = "user_role",
        joinColumns = {@JoinColumn(name = "user_id", nullable = false)},
        inverseJoinColumns = {@JoinColumn(name = "role_id", nullable = false)}
)
private List<Role> roles;

我通过使用服务方法加载< code>User,服务方法被包装在一个事务中(JTA)。在调用服务方法并检索< code>User之后,我在用于加载< code>User实体的事务之外访问这个< code>role字段。我以为会出现错误,因为eclipselink文档指出,默认情况下,ManyToMany关联的fechtype是懒惰的。这告诉我,当在服务方法中加载< code>User实体时,不应该自动加载< code>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个答案

劳鹏云
2023-03-14

Eclipse Link允许获取惰性关系,只要上下文仍然可用,如下所述:https://forums.oracle.com/forums/thread.jspa?messageID=1706796

链接死了,我找不到原来的帖子,但是文档在“容器管理的持久性上下文”下有一行:

Eclipse Link支持在持久性上下文关闭后访问实体的LAZY关系。

关于这个主题,已经有很多文章以这种形式和其他形式发表,因为它是与其他JPA提供商的主要区别,它的共享缓存实现也是与该功能紧密相关的。

 类似资料:
  • 如果我有一个实体和一些惰性集合(、、,...),并且希望编写一个JpaRepository-method,该方法为我提供所有的人,这些人都渴望获取,这可能吗? 我知道人们可以在单个物体上做到这一点,但这在某种程度上可以在人的集合上做到吗?

  • 我已经尝试了很多次初始化惰性集合的方法,但没有任何效果 1尝试: At线

  • 我有两个大表(每个表>一亿行),让我们把它们称为Parent和Child(Parent与Child有一个懒散的一对多关系)。当我使用联接提取时,查询速度非常慢,而且我还得到一个Hibernate警告“HH000104 firstresult maxresults specified with collection fetch Application in Memory”,因为我使用了一个限制。 因

  • 我正在开发一个Struts2 Spring Hibernate webapp,我需要在检索一个对象或该对象的集合后初始化一个惰性集合。 用例 我有一个团队模型,其关系被热切地加载为员工(我认为这显然是一个集合)。反过来,员工模型有一个懒惰的关系注册表,我只需要一些特定的操作,所以我根本不需要急切地加载它。 现在。我调用我的(用Spring注入到我的Struts2控制器中),以便检索一个特定的已经加

  • 我的密码是 有什么办法解决这个问题吗

  • 我有一个JAX-RS资源类。它调用一个加载实体的无状态EJB(我们称之为)。 与另一个实体具有关系(我们称之为),并且配置为具有的提取类型。 任何东西上都不会出现额外的事务性注释,因此无状态EJB的默认行为是在必要时启动事务,并在事务的业务方法完成后提交事务。 在调试器中,我观察到EJB返回的将作为的值,正如我所怀疑的那样。因此,惰性加载工作良好。 然后,我的资源类构建一个并将控制权交给JAX-R

  • 我目前正在使用bitnami/kafka image(https://hub.docker.com/r/bitnami/kafka)并将其部署在kubernetes上。 kubernetes大师:1 库伯内特斯工人:3人 在群集中,其他应用程序能够找到 kafka。尝试从群集外部访问 kafka 容器时出现问题。在阅读时,我读到我们需要为外部 kafka 客户端设置属性“广告.监听器=纯文本://

  • 在Swift 4.1之前,我使用从集合中删除值。现在此方法已弃用,我需要将其替换为。有时我使用带有惰性集合的来优化我的代码,如下所示: 如果我使用而不是,它会有相同的效果吗?在方法的留档中,我找到了对和的引用。