gpt4 book ai didi

java - 使用 hibernate 和 fetch=FetchType.LAZY 从表中获取数据

转载 作者:行者123 更新时间:2023-12-01 08:12:40 25 4
gpt4 key购买 nike

我正在尝试从表中获取所有用户的电子邮件。实体用户:

     @Entity
@Table(name = "tbl_User")
public class User {
@Expose
@Id
@GeneratedValue
@Column(name = "id")
private Long id;
.....
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
List<CommunicationAddress> communicationAddresses = new ArrayList<CommunicationAddress>();
.....
}

在服务中,我正在获取用户并尝试查看电子邮件:

User user = userDAO.getUserById(id);
if (user == null) {
throw new Exception("User not found");
} else {
List<Email> addresses = user.getCommunicationAddresses();
}

但是我收到了下一个异常:

 org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:137)
at org.hibernate.collection.internal.PersistentBag.isEmpty(PersistentBag.java:249)

获取用户的方法:

@Transactional
@Override
public User getUserById(Long userId) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class);
criteria.add(Restrictions.eq("id", userId));
return (User) criteria.uniqueResult();
}

我明白,当我使用 Criteria 获取用户时,我必须获取 communicationsAddresses...怎么做?谢谢大家。

最佳答案

您的服务方法似乎没有用@Transactional注释。因此,调用userDAO.getUserById(id);后,不再有事务。这意味着您无法访问事务中尚未访问/预取的已加载实体的任何延迟加载属性,除非遇到 LazyInitializationException。
因此,您可以考虑将 LAZY 替换为 EAGER 获取(这主要取决于您面临的用例),或者您应该使用 @Transactional 注释您的 Service 方法.

我强烈建议注释您的服务方法(而不是 DAO 方法),因为只有在那里,您才能在与多个实体交互时建立有意义的事务边界。
此外,如果您使用延迟加载,您必须意识到离开服务层后遇到此类异常的可能性,例如渲染 View 时(假设您以某种方式呈现数据)。

“预取”惰性关联

要触发延迟关联的即时加载(称为“dynamic association fetching ”),请在 getUserById 中添加此行:

criteria.setFetchMode("communicationAddresses", FetchMoode.EAGER);

但是,如果您在这个特定方法中这样做,我想知道为什么您坚持延迟加载?

关于java - 使用 hibernate 和 fetch=FetchType.LAZY 从表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16109868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com