【问题标题】:JPA persist flush functionsJPA 持久化刷新函数
【发布时间】:2014-01-26 15:02:29
【问题描述】:

根据这两个功能,我有一个奇怪的“问题”。 我有一个无状态的 EJB 容器,其中我的函数可以对我的数据库进行插入、更新、删除选择。

我的表在实体中,因此上述操作使用这些实体,除了一些选择。

我面临的问题是,直到现在(AppServer glassfish)我只使用 .persist() 函数,如果有任何违规问题(px 大于表的列长度的“字符串”)然后我尝试catch(Exception e) 块正在捕获这些问题,我可以向调用特定函数的 EJB 以及最初调用该函数的 web 服务发送更激烈的消息/异常。

现在使用 JBoss 我无法捕获相同的异常,并且代码返回了回滚异常。当我在每个函数的末尾添加 .flush() 函数时,我可以捕获异常并且一切正常。

(当然,在这两种情况下,回滚都按照我的意愿工作) 我已经读到,通过持久化数据保留在缓存中,java 决定何时在数据库中执行实际操作,当您调用 flush 时,您会强制兑现操作以正确的方式在数据库中完成。

我的问题是,为什么会这样?我的意思是从一个 appServer 到另一个具有相同代码的变化,主要是如果我无法捕获异常,最终的 web 服务将如何获取异常

【问题讨论】:

  • 它不像看起来那么兼容:-(
  • 也许您应该在尝试持久化数据之前验证您的数据并避免任何异常。您是否考虑过使用Bean Valudation 使用Hibernate Validator Implementation
  • @EdwinDalorzo 纠正我如果我错了,在我的实体类中我有注释 @Size(min = 1, max = 30) 我从数据库中“获取”它,因为我创建了实体我的数据库。我想当我创建我的实体时,我必须以某种方式激活这个“约束”?
  • 我使用了下面的代码 Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set> constraintViolations = validator.validate(myCar);但是当我抛出一个运行时异常时,事务并没有按原样回滚。

标签: java hibernate jpa


【解决方案1】:

答案在于每个应用程序如何管理与 JPA 相关的操作。根据定义,JPA 只是一个 API。市场上有不同的 JPA 提供程序,例如 Hibernate、OpenJPA、EclipseLink ......因此,根据每个应用程序服务器使用的默认 JPA 提供程序,您可能会在处理某些操作的方式上遇到一些差异。

仅供参考:根据 JBoss AS 6 文档,当 commit() 方法失败时抛出 RollbackException 是绝对正常的

JBoss RollbackException documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多