Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 在3层JavaEE应用程序中休眠延迟加载_Hibernate_Rest_Jakarta Ee_Lazy Loading_3 Tier - Fatal编程技术网

Hibernate 在3层JavaEE应用程序中休眠延迟加载

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方

我已经用hibernate和10构建了一个JavaEE应用程序。我没有使用任何servlet,而是使用了一个用JavaAPI为RESTfulWebService构建的RESTAPI。因为我的模型越来越大,我从FetchType.eagent到FetchType.LAZY设置集合。现在我得到一个LazyInitializationException,消息是无法初始化代理-没有会话。我想我确实理解为什么会发生这种情况,但我不理解hibernate何时尝试访问代理

实体:


我认为问题在于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
}