繁体   English   中英

在不更新数据库的情况下合并/重新连接IN JPA / Hibernate

[英]merging / re-attaching IN JPA / Hibernate without updating the DB

在OSIV Web环境中使用JPA / Hibernate使我发疯;)

以下情况:我有一个通过JPA加载的实体A,并且有一个B实体的集合。 这些B实体具有必填字段。

当用户通过按下Web应用程序中的链接将新的B添加到A时,未设置必填字段(因为没有明智的默认值)。

在下一个http请求时,OSIV筛选器尝试合并A实体,但这失败,因为Hibernate抱怨新的B的必填字段未设置。

javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value

阅读JPA规范,我看不到在合并阶段需要进行这些检查的迹象(我没有活动的事务)

我不能将B的集合保留在A之外,而仅当用户按下“保存”(又名entitymanager.persist())时将它们添加到A中,因为保存按钮所在的位置不知道B的地方,只知道一种。

另外,A和B只是示例,我到处都有类似的内容。

有任何想法吗? 其他JPA实现在这里的行为是否相同?

提前致谢。

我做了很多阅读和测试。 问题来自我对JPA / Hibernate的误解。 merge()总是会对数据库产生影响,并且还会为实体安排更新。 在JPA规范中,我没有提到这一点,但是“带有Hibernate的Java持久性”书中确实提到了这一点。

通过EntityManager(和Session作为后备)API查看,似乎没有办法在不安排更新的情况下仅将实体分配给当前持久性上下文。 毕竟,我要导航的是对象图,根据需要更改属性,然后稍后触发更新(如果需要,请进行版本检查)。 我认为使用ORM的每个Web应用都必须做什么?

我正在寻找的基本工作流程:

  1. 从数据库加载一个实体(或创建一个新实体)
  2. 让实体(及其所有关联变为分离)(因为EntitManager在HTTP请求结束时关闭)
  3. 当下一个HTTP请求进入时,再次使用这些对象,在树中导航,而不必担心LazyInitExceptions
  4. 调用一种方法,该方法将保留在1-3期间所做的所有更改)

结合Spring的OSIV过滤器和wicket的IModel实现,我认为我已经对此进行了归档。

我基本上看到了两种可能的解决方法:

a)进入特定页面(用例)时,加载实体和所需的所有关联,让它们分离,并在几个http请求过程中根据需要添加/更改它们。 比用户启动保存时重新附加它们(验证程序将确保状态有效)并将它们提交到数据库。

b)使用当前设置,但请确保所有新添加的实体均设置了其所有必填字段(可能使用某些向导组件)。 对于每个merge(),我仍将具有数据库的所有更新,但是希望数据库管理员不会意识到;)

其他人如何在Web环境中使用JPA? 还有其他选择吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM