2014-01-26 95 views
0

根据这两个函数我有一个奇怪的“问题”。 我有一个EJB容器,无状态的,我有我的功能,使插入,更新,删除选择到我的数据库。JPA坚持刷新功能

我有我的表在实体,所以上述操作使用这些实体,除了一些选择。我正在面临的问题是,直到现在(AppServer glassfish)我只使用.persist()函数,并且如果有任何违规问题(px比表格的列长度更大的“字符串”),那么我的尝试catch(Exception e)块捕获这些问题,并且我可以向EJB发送一个更加强烈的消息/异常,该消息/异常称为特定函数,因此也称为最初称为该函数的web服务。

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

(当然,在这两种情况下,回滚工作正如我想做的那样) 我已经读过,持续数据保留在缓存中,而java正在决定何时在数据库中执行实际操作,以及何时调用刷新,然后强制兑现动作在数据库中完成。

我的问题是,为什么会发生这种情况?我的意思是什么从一个appServer改变到另一个具有相同的代码,并且大多如何如果我不能捕捉异常最终web服务获得异常

+1

它不太兼容似乎比:-( – Leo

+0

也许你应该在数据持久化之前验证你的数据并避免任何异常。你有没有考虑使用[Bean Valudation](https://jcp.org/en/jsr/detail?id=349)[Hibernate Validator Implementation ](http://hibernate.org/validator/)? –

+0

@EdwinDalorzo纠正我,如果我错了,在我的实体类我有注释@大小(最小= 1,最大= 30),我“从它得到它” DB as我从我的数据库创建实体。我想,当我创建我的实体时,我必须以某种方式使这个“限制”活动? – GeoPapa

回答

0

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

FYI:根据到JBoss AS 6的文档,这是绝对正常的,你得到一个RollbackException,因为它在提交被抛出()方法失败

JBoss RollbackException documentation