【发布时间】:2017-12-19 21:49:10
【问题描述】:
我已经使用 hibernate 和 wildly 10 构建了一个 Java EE 应用程序。我没有使用任何 servlet,而是使用 Java API 构建的 REST API 用于 RESTful WebService。因为我的模型变得越来越大,所以我将我的收藏集从FetchType.EAGER 设置为FetchType.LAZY。现在我收到了LazyInitializationException 和消息could not initialize proxy - no Session。我想我确实理解为什么会发生这种情况,但我不明白 hibernate 何时尝试访问代理。
实体:
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Version
private Timestamp lastChanged;
@NotNull
private Date creationDate;
@ManyToMany
private Set<Entity> lazyEntity;
public User() { }
// getters and setters
}
DAO:
public interface UserDAO {
public List<User> getAll();
}
豆:
@Stateless
@Remote(UserDAO.class)
public class UserBean<User> implements UserDAO {
@PersistenceContext
protected EntityManager em;
@Override
public List<User> getAll() {
return this.em.createQuery("SELECT u FROM User u ORDER BY u.creationDate", User.class)
.getResultList();
}
}
端点:
@Path("/users")
@Stateless
public class UsersEndpoint {
@EJB
private UserDAO userDAO;
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAll() {
List<User> users = userDAO.getAll();
if (users.size() == 0)
return Response.status(Response.Status.NOT_FOUND)
.build();
return Response.ok(users).build();
}
}
我的问题是为什么lazyEntity 不只是返回为 null 而是抛出错误?在哪一部分是休眠尝试访问lazyEntity,因为正如您在上面的代码中看到的那样,我不会尝试在API端点内访问。我能捕捉到异常吗?
如何在不出现异常的情况下接收如下对象?我已经看到可以通过更改属性hibernate.enable_lazy_load_no_trans 来禁用它。但我也read 表示不强烈推荐。
User {
id: 1,
lastChanged: 0981283812738,
creationDate: 2178371283098,
lazyEntity: null
}
【问题讨论】:
标签: hibernate rest jakarta-ee lazy-loading 3-tier