Java 在JPA/Hibernate中合并/重新连接而不更新数据库

Java 在JPA/Hibernate中合并/重新连接而不更新数据库,java,hibernate,web-applications,jpa,Java,Hibernate,Web Applications,Jpa,在OSIV Web环境中使用JPA/Hibernate让我抓狂;) 下面的场景:我有一个通过JPA加载的实体A,它有一个B实体的集合。这些B实体有一个必填字段 当用户通过按webapp中的链接向a添加新B时,不会设置该必填字段(因为没有合理的默认值) 在下一个http请求时,OSIV过滤器尝试合并A实体,但失败了,因为Hibernate抱怨没有设置新B的必填字段 javax.persistence.PersistenceException: org.hibernate.PropertyValue

在OSIV Web环境中使用JPA/Hibernate让我抓狂;)

下面的场景:我有一个通过JPA加载的实体A,它有一个B实体的集合。这些B实体有一个必填字段

当用户通过按webapp中的链接向a添加新B时,不会设置该必填字段(因为没有合理的默认值)

在下一个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

A和B也是唯一的例子,我到处都有类似的东西

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


提前感谢。

我做了很多阅读和测试。这个问题来自我对JPA/Hibernate的误解。merge()始终对数据库执行命中操作,并为实体安排更新。我在JPA规范中没有发现任何提到这一点的地方,但《带Hibernate的Java持久化》一书确实提到了这一点

通过EntityManager(以及会话作为回退)API查看,似乎无法将实体分配到当前持久性上下文而不安排更新。毕竟,我想要的是浏览对象图,根据需要更改属性,并在以后触发更新(如果需要,使用版本检查)。我认为每个使用ORM的网络应用都必须做些什么

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

  • 从数据库加载实体(或创建新实体)
  • 让实体(及其所有关联)分离(当EntitManager在HTTP请求结束时关闭)
  • 当下一个HTTP请求到来时,再次使用这些对象,在树中导航而不必担心lazyinit异常
  • 调用一个方法,该方法将保存在1-3期间所做的所有更改)
  • 有了spring的OSIV过滤器和wicket的IModel实现,我想我已经存档了

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

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

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

    其他人如何在web环境中使用JPA?我还有别的选择吗