- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设在应用程序中您有一个名为“用户”的实体。每个用户可以拥有许多使用延迟获取加载的文章。
@Entity
@Table(name = "Users")
public class User {
private Integer id;
private Set<Article> articles = new HashSet<Article>();
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL)
public Set<Article> getArticles() {...}
}
在Web服务端,我想通过Id加载用户并将其传递给jersey Viewable JSP以返回和显示。我还想对每个请求使用一个 session 。
@GET
public Response getUser() {
Session session = getSessionFactory().openSession();
session.beginTransaction();
User user = (User) session.getNamedQuery("getUserById").setInteger("id", 1).uniqueResult();
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("user", user);
Viewable v = new Viewable("/user", dataMap);
Response r = Response.ok(v).build();
session.getTransaction().commit();
session.close();
return r;
}
在 user.jsp 中,我想访问文章并将其打印出来。
<c:forEach var="a" items="${it.user.articles}">
<span>${a.title}</span>
</c:forEach>
运行此代码并尝试请求 JSP 最终会引发异常:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: my.package.User.articles, no session or session was closed
发生这种情况是因为显然创建 Viewable、将其传递给 ResponseBuilder 并调用 build() 实际上并没有创建 JSP。在我的方法返回并且 session 已关闭之后,JSP 会在更远的地方创建。
一个明显的选择是将文章的获取类型设置为 eager,但这并不理想,因为在大多数情况下,当我使用 User 对象时,我不需要加载或显示文章。
有没有办法强制 jersey 在我的方法返回之前解释和构造 jsp?是否有某种 onResponse 或 postResponse 监听器我可以传递我的代码来关闭 session ?
一般情况下,我处理打开/关闭 hibernate session 的方式是否应该采取不同的做法?通过谷歌搜索,每个请求一个 session 似乎是大多数人提倡使用的方式,所以我想我应该尝试一下。
最佳答案
"open session in view"方法确实是解决这个问题的方法。
另一种方法是使用 EJB 或 Spring。然后他们将接管交易处理。当与 JPA EntityManager 一起使用时,EJB 会完全透明地完成此操作,Spring 为此提供了 org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter 过滤器。
如果您的容器支持 EJB,则只需创建一个 @Stateless
:
@Stateless
public class UserService {
@PersistenceContext
private EntityManager em;
public User find(Integer id) {
return em.createNamedQuery("getUserById", User.class)
.setParameter("id", id)
.getSingleResult();
}
}
并在您的网络服务中使用它,如下所示:
@EJB
private UserService userService;
@GET
public Response getUser() {
User user = userService.find(1);
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("user", user);
Viewable v = new Viewable("/user", dataMap);
Response r = Response.ok(v).build();
return r;
}
无需再担心事务和延迟获取。
关于java - 使用 hibernate 和 jersey JSP viewables 实现按请求 session + 延迟获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705697/
JAX-RS 实现 Jersey 通过 Viewable 类支持 MVC 风格的 Web 应用程序,该类是模板名称和模型对象的容器。是used like this : @GET public View
在下图中,您可以在 (1) 中看到一个三角形和一个圆圈。给定三角形中的专用点 X,我想剪掉从该点看不到的所有内容。使用像 (2) 中那样的简单多边形差分算法只删除圆是没有问题的。但是我可以使用什么样的
TLDR:我的方法需要 2 个重定向/转发才能工作(1 个用于身份验证,1 个用于提供 jsp 页面)。如何解决重定向/转发(或使其成为非要求),以免遇到错误 java.lang.IllegalSta
我正在开发一些功能来确定 GPT 广告在页面上的可见性,并且我正在为每个广告使用“slotRenderEnded”事件来确定广告当时是否确实“可见”。 这是对广告可见度的准确/适当衡量吗?有时似乎这个
在给定页面名称作为 PathParam 的情况下,我希望能够从 restful 服务返回特定的 jsp 页面。应用程序部署后,这些页面将由不同的一组人员添加和删除。 我相信使用 Viewable ob
问题标题可能含糊不清。基本上,想象一个用 Canvas 构建的赛车游戏。轨道占用 10,000 x 10,000 像素的屏幕空间。但是浏览器窗口是 500 x 500 像素。汽车应该在浏览器中居中,1
我有一个可滚动的屏幕,上面有一个打印按钮,并且在其 onclick 事件上调用了“window.print()”函数。 我的问题是它只打印屏幕的“可视”部分,而不是整个屏幕。如果页面是可滚动的,如果内
我需要知道如何在 google map API v3 中检索可见缩放级别的半径。 例如,如果我处于缩放级别 3,并且根据用户屏幕尺寸(假设为 400x400 可视区域),如何获取可视区域的“半径”圆。
我正在尝试将 Spring 3.0.5 与 Jersey 1.4 集成。我似乎一切正常,但每当我尝试返回指向 JSP 的 Viewable 时,我都会收到 404 错误。当我不使用 spring 时,
我将 HTML 扔到 webview 进行渲染。在 HTML 中,我需要加载 /res/drawable 中的图像。 我有 /res/drawable/my_image.png 和这样的代码: fin
简短版:在我的移动网络应用程序中,我想始终检测屏幕的可视区域(例如,软键盘顶部(如果存在)和标题栏底部之间的空间),这样我就可以调整我的布局,不缩放,并始终保持页面在屏幕上完全可见。有什么可靠的方法可
我正在创建自定义 View (扩展 WebView)。我想监听 View 的可视状态。 可视状态表示 View 是否显示在屏幕上。我不是说能见度。例如, View 在 ScrollView 下,当用户
我有一些 div 和输入框。当我调整窗口大小时,div 会适当调整,但输入会被剪裁。如何在最大宽度为 400 像素的情况下将输入调整为屏幕大小?下面是两种状态的截图:Looks good .但是当页面
我正在尝试实现 Viewer我的 Swift 项目中包含 pod 包,并根据我需要创建符合下面 Viewable 协议(protocol)的项目集合。 如何使下面的 for-loop 中的图像 Str
我发现如果我有一个 Viewable (jersey) 将模型传递给 JSP,那么访问它的方法是在映射键前加上 it 例如 index.jsp Hello World ${it.foo}! J
重要的部分是:没有web.xml。 我已经有一个在 Glassfish 3.1.2.2 上运行的 JAX-RS 应用程序,没有 web.xml,完全由注释配置。 问题是,我如何才能保持无 web.xm
假设在应用程序中您有一个名为“用户”的实体。每个用户可以拥有许多使用延迟获取加载的文章。 @Entity @Table(name = "Users") public class User { pr
我使用了网上的简单代码code我能够在 for 循环中调用代码中的方法并向其传递数据和行号。文件已正确创建,文件的大小(刷新文件资源管理器后)在每次插入时都会更改,但是当我完成后,我打开文件,我只能看
编辑(原始帖子位于代码下方)** fiddle :https://jsfiddle.net/Tron4949/oezuz1g9/9/( fiddle 示例不会有背景,没有必要演示该问题,控制台日志会显
我有以下代码 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
我是一名优秀的程序员,十分优秀!