【发布时间】: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);但是当我抛出一个运行时异常时,事务并没有按原样回滚。