Hibernate 在3层JavaEE应用程序中休眠延迟加载
我已经用hibernate和10构建了一个JavaEE应用程序。我没有使用任何servlet,而是使用了一个用JavaAPI为RESTfulWebService构建的RESTAPI。因为我的模型越来越大,我从FetchType.eagent到FetchType.LAZY设置集合。现在我得到一个LazyInitializationException,消息是无法初始化代理-没有会话。我想我确实理解为什么会发生这种情况,但我不理解hibernate何时尝试访问代理 实体:Hibernate 在3层JavaEE应用程序中休眠延迟加载,hibernate,rest,jakarta-ee,lazy-loading,3-tier,Hibernate,Rest,Jakarta Ee,Lazy Loading,3 Tier,我已经用hibernate和10构建了一个JavaEE应用程序。我没有使用任何servlet,而是使用了一个用JavaAPI为RESTfulWebService构建的RESTAPI。因为我的模型越来越大,我从FetchType.eagent到FetchType.LAZY设置集合。现在我得到一个LazyInitializationException,消息是无法初始化代理-没有会话。我想我确实理解为什么会发生这种情况,但我不理解hibernate何时尝试访问代理 实体: 我认为问题在于getAll方
我认为问题在于getAll方法的JSON序列化导致方法上的注释触发UsersEndpoint 我假设您使用Jersey+Jackson,这是一个常见的JavaJSON转换器 当getAll方法完成时,Jackson获取该方法的结果,并尝试通过获取用户类的所有数据将其转换为JSON。为此,Jackson在User类中调用getLazyEntity,由于它是延迟加载的,因此触发数据库访问,并由于会话关闭而失败 如果希望在JSON响应中包含lazyEntity的数据,则必须在会话关闭之前获取数据:在DAO内部,在HQL查询中使用fetch联接
如果您不想在JSON中使用lazyEntity,您必须告诉Jackson不要序列化lazyEntity,您可以使用Jackson视图来实现。请参阅和。谢谢您的解释。但是我找不到@JsonView注释。还有别的办法吗?好的,我知道了。但是我使用了@JsonIgnore而不是@JsonView。我认为这代码要少得多,或者你不同意吗?我同意@JsonView很麻烦。它的优点是一个属性可以映射到多个@JsonView,这允许一些端点序列化对象的所有属性,而其他端点只序列化对象的一部分。
@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
}
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();
}
}
User {
id: 1,
lastChanged: 0981283812738,
creationDate: 2178371283098,
lazyEntity: null
}