【发布时间】:2013-04-13 03:45:35
【问题描述】:
我正在尝试从表中获取所有用户的电子邮件。 实体用户:
@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 获取用户时,我必须获取communicationAddresses... 怎么做?谢谢大家。
【问题讨论】:
-
服务方法是事务性的吗?会话工厂是由 Spring 在 DAO 中创建和注入的吗?
-
@JBNizet 是的。工厂注入。
-
用户用户 = userDAO.getUserById(id);在此之后尝试 user = user.getId()。它将为您加载代理对象,然后您可以加载地址
-
@Chandu 是的。我得到了用户的属性,但是当我尝试使用调试和 IDEA 来查看通信地址时,我看到下一条消息“方法抛出了 'org.hibernate.LazyInitializationException' 异常。”
-
@Chandu 这不是真的。
load()不会获取惰性属性;更糟糕的是:它只会返回一个代理(想想一个完全延迟加载的实体),它在事务之外没有用(除了提供 ID)。
标签: java spring hibernate hibernate-mapping