java – 合并/重新附加IN JPA / Hibernate而不更新数据库

在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规范,我没有看到在合并阶段需要这些检查的迹象(我没有活动的交易)

当用户按下“保存”(又名entitymanager.persist())作为保存按钮不知道B的地方时,我无法将B的集合保留在A之外并仅将它们添加到A中,仅关于一个.

另外A和B只是例子,我到处都有类似的东西..

有任何想法吗?其他JPA实现在这里表现如何吗?

提前致谢.

最佳答案 我做了很多阅读和测试.问题来自于我对JPA / Hibernate的误解. merge()总是对数据库进行命中,并为实体安排更新.我没有在JPA规范中找到任何提及,但是“Java Persistence with Hibernate”一书确实提到了它.

通过EntityManager(以及Session作为回退)API,它看起来好像没有办法将实体分配给当前持久化上下文而不安排更新.毕竟,我想要的是导航对象图,根据需要更改属性并在以后触发更新(如果需要,可以进行版本检查).我认为使用ORM的每个Webapp都必须做什么?

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

>从DB加载实体(或创建一个新实体)
>让实体(及其所有关联分离)(因为EntitManager在HTTP请求结束时关闭)
>当下一个HTTP请求进入时,再次使用这些对象,导航树而不用担心LazyInitExceptions
>调用一个持续1-3期间所做的所有更改的方法

使用来自spring的OSIV过滤器和来自wicket的IModel实现,我认为我已经存档了这个.

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

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

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

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

点赞