【发布时间】:2016-08-18 06:18:20
【问题描述】:
我目前在 Spring MVC 4.2.3 中使用 Hibernate 4.3.5。我有两个模型User 和Client,其中User 的id 是Client 的外键。
在User 类中:
@Repository
@Transactional
public class UserDAOImpl implements UserDAO {
@Autowired
private SessionFactory sessionFactory;
protected SessionFactory getSessionFactory() {
try {
return (SessionFactory) new InitialContext().lookup("SessionFactory");
} catch (Exception e) {
log.error("Could not locate SessionFactory in JNDI", e);
throw new IllegalStateException("Could not locate SessionFactory in JNDI");
}
}
@OneToMany(fetch = FetchType.EAGER, mappedBy = "user")
public Set<Client> getClients() {
return this.clients;
}
......
}
在Client,我设置:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
public User getUser() {
return this.user;
}
SessionFactory 在root-context.xml 中定义。这样,我应该可以从分离的User对象中获取clients,对吧?但是,当我运行这段代码时:
results.addAll(userDAO.findById(id).getClients());
它返回了以下异常:
WARN : org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: com.hersbitcloud.cancercloud.models.Client["user"]->com.hersbitcloud.cancercloud.models.User["clientss"]->org.hibernate.collection.internal.PersistentSet[0]->com.hersbitcloud.cancercloud.models.Client["user"]->com.hersbitcloud.cancercloud.models.User["clients"]->org.hibernate.collection.internal.PersistentSet[0]-
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
堆栈跟踪非常长,我认为这意味着当我获得User 时,它同时获取Client,因为它是EAGER。然后User对象被再次获取为Client的内部对象,即使它被设置为LAZY。这个过程来来回回,永不停息。
我了解LAZY 仅在会话中获取内容。我的问题是,为什么与User 的会话永不过期?
【问题讨论】:
-
您使用的是 JSON 吗? stackoverflow.com/questions/32354856/…