问题标签 [open-session-in-view]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 使用 JPA 在 ConstraintViolationException 之后保持持久/合并
如何使用 JPA + Hibernate 和 Open Session in View 策略在 ConstraintViolationException 之后合并和更新实体?
我知道发生异常后事务/会话变脏。有什么方法可以清理它并坚持合并吗?
java - 在视图中打开带有注释的会话
是否可以使用注释来执行 OpenSessionInView 过滤器所做的任何事情:保持休眠会话在范围内打开但仅用于一个带注释的功能?
PS 我需要这个来修复一些遗留代码中的本地问题。
java - 出现异常时如何关闭和打开新的 Hibernate 会话
上下文/设置
我们在带有 Spring 和 Hibernate 集成的应用程序中使用 open-session-in-conversation-filter 模式。
我们正在使用 Springs 声明性事务管理,使用org.springframework.transaction.interceptor.TransactionProxyFactoryBean
.
当应用程序收到请求时,我们会执行多个数据库活动(插入/更新),其中更新和插入单独刷新到数据库并提交事务。
问题
假设对于其中一个插入/更新,引发了数据库异常,休眠会话按预期关闭,因为会话处于无效状态。
即使在此之后,如果我不想返回请求并希望继续我的请求并完成我无法完成的其他活动,因为会话已关闭并且通过此会话的任何后续调用都失败了,原因很明显。
我需要帮助编写一个解决方案,我可以关闭现有会话并打开一个新会话并将最新会话附加到线程使用TransactionSynchronizationManager
但不确定如何执行此操作,因为在很多地方我可能需要在流程中执行此操作,有没有通用的方法来做到这一点?它甚至是正确的设计吗?
即使我实现了这一点,与前一个会话分离的实体如何自动附加到新会话,以便代理无缝工作?
java - 使用 Spring MVC 和 Hibernate 每个请求的单个事务
我想使用 Spring MVC 和 Hibernate。我不想@Transactional
在所有控制器方法上使用服务层或属性(或者,我希望 Spring 将它们全部视为事务性的)。所以我想在控制器方法开始使用数据库时启动事务,并在控制器方法返回 ViewAndModel 时提交事务,或者如果发生任何错误则回滚事务。我还希望视图支持延迟休眠加载,例如,如果 html 模板请求,则以自动提交模式选择数据。
我知道最佳实践涉及创建一个带有@Transactional
属性的单独服务层,但我的应用程序不会从这种额外的复杂性中受益,我想尽可能地简化代码。
我了解到OpenSessionInViewInterceptor
允许在视图中继续使用休眠会话,因此这可能解决了我的第二个要求。但是如何使所有控制器方法都具有事务性?
理想情况下,如果我需要,我想要一种简单的方法来选择退出这种行为。例如,所有方法都是事务性的,但我可以应用 @NonTransactional 之类的方法并更精细地管理事务。
hibernate - 我们什么时候需要 .save() Spring 中的实体?
在一个相对较大的 Spring Boot 项目中,我有一个方法具有以下(过于简化)事件序列:
Car
,Person
并且Engine
都是@Entity
类(数据库对象)。对于此示例,它们的实现可能如下:
上述方法仅在 REST API 方法内部使用。并且在配置属性中启用了 OSIV(在视图中打开会话)。
问题是,为什么我需要保存person.getCar()
对象?它与Car
我刚刚在同一请求处理期间创建的对象相同。在什么时候它会变成暂时的并且不受持久性上下文的管理?我认为所有更改都会自动刷新,因为启用了 OSIV。
如何检测此类情况并确切知道何时使用该.save()
方法以及何时可以忽略它?
jpa - 创建后未管理 JPA @Entity?
我有一个简单的控制器方法,在其中创建一个新对象Car
,然后将其名称设置为Audi
:
在数据库中,它永远不会变成Audi
,而是保持VolksWagen
.
为什么会这样?对于持久性上下文,新创建的不Car
应该处于托管状态吗?
注意:如果我添加@Transactional
注释,它会起作用。我认为如果启用 OSIV 就足够了。我对 OSIV 和 有什么误解@Transactional
?
spring - Spring Boot中双向一对多关系的LazyInitializationException
以下 Spring Boot 服务方法LazyInitializationException
在尝试将 a 添加Comment
到 aPost
时会引发 Hibernate post.addComment(comment)
:
实体映射如下:
的或的帖子引用的ManyToOne
获取类型似乎没有什么区别。EAGER
LAZY
Comment
我在这里做错了什么?如何解决这个错误?
随着@mckszcz 建议的更改,现在同一服务上的以下方法在尝试从帖子中获取评论时会引发一些反射异常:
如方法的 javadoc 中所述,需要将其更改为返回属于帖子的所有评论的列表?
java - OSIV 启用 Spring Data JPA 存储库在从 Spring Redis 订阅者调用时不运行 DML 查询,但在作为 http Web 请求调用时工作
我有一个 Spring Boot 微服务,它有一个端点可以从表中删除条目。我正在使用 Spring Data JPA 来执行此操作。当我调用 api、发送 HTTP 请求并且 JPA 存储库删除数据时,它工作正常。OSIV 已启用,它会自动注册 EntityManager,创建数据库连接并确保它在 Web 请求的整个生命周期内都可用。
我有一个由 Spring Redis 在同一个应用程序中提供的 Redis 消息订阅者,它监听事件并调用同一个 JPA 存储库以从表中删除数据。我注意到从订阅者调用时 JPA 存储库没有执行删除/更新/插入。我了解此流程中未创建的事务存在问题。我尝试使用@Transactional,但由于缺少事务,它仍然失败。
如果 Redis 消息容器需要一些其他配置来启用 JPA 存储库的事务,请帮助我。
thymeleaf - Thymeleaf lists.sort 导致 LazyInitializationException 尽管在视图中打开会话
我有一个 Sprint Boot 项目,其中包含开放会话。当我尝试对这样的列表进行排序时
我得到一个 LazyInitializationException
spring - 在视图 OSIV 中打开会话 - 每个请求/线程都会发生这种情况吗?
我已经在 Spring 项目中关闭了 OSIV,因为我一直在阅读为什么它(有争议地)可能有点反模式。不想戳那个辩论,因为我已经看到它变得激烈,但我对技术更感兴趣/迷失了。
无论哪种方式,我都想知道会话何时打开?是针对任何传入的 Web 请求,还是应用程序知道它只需要针对某些端点的会话?我猜OSIV Filter
基本上总是为每个请求调用,并且获取到数据库的休眠会话并将其添加到 webrequest/thread 中?
即它是所有东西的OSIV,还是只有某些请求通过整个过滤器链绑定会话,然后控制器/服务再退出?
当他们说“会话”时,我正确地假设这意味着它已经获得了一个活动的 jdbc 连接并打开了与数据库的连接......即使我可能不使用它,这就是可能发生阻塞 IO 问题的地方说如果我们正在等待 3rd 方的响应,尽管我们现在超出了@Transactional
服务方法边界并且我们得到了流量高峰?
究竟什么是明智的开放会话?是否通过会话“以防万一”在每个请求上启动数据库事务?或者是否只为每个请求创建了一个休眠会话,然后只有在沿着请求的某处启动 JPA/Hibernate 查询(有或没有)时才启动事务@Transactional
。
任何澄清都会很棒!