首先,我想道歉,如果我找不到任何关于我想描述的东西,真正解决了我的问题。这并不意味着我在网站上搜索完全。虽然我花了太多时间(天)。我也是新来的(从某种意义上说,我从未写过/回复过SO用户)。我很抱歉我的英语错误。
我不得不说我是Java EE的新手。我正在使用MySQL工作在WildFly 14上。我现在专注于JPA问题。我有一个唯一性约束。我正在进行测试并在执行唯一性违规测试时,从数据源级别获得MySQLIntegrityConstraintViolationException,这没关系。我的问题在于persist()方法不允许我捕获异常(我甚至把Throwable放在子句中,但没有...)。我强烈地,严格地说,需要抓住它,以便在我的工作代码中管理一个关键程序(间接包含对.remove()的调用)。
顺便说一下,尝试编写该异常,系统没有向我显示建议的类/注释/等的窗口,建议我只创建类“MySQLIntegrityConstraintViolationException”。有没有在使用MySQL的WildFly上工作,足以获得建议?
没有找到解决方案,我决定改变:而不是使用persist(),我决定使用.createNativeQuery(),其中我将一个String作为参数放在db中描述插入。看起来很有效。确实它有效(信号唯一性违规(ok!),不执行TRY块代码(ok!)并进入CATCH块(ok!))。但是,异常/错误再次不明确。此外,当在代码中我输入负责管理捕获然后执行内部的代码(并且我在内部有.remove())时,它会引发异常:
“执行此操作需要事务(使用事务或扩展持久化上下文)” - >这指的是我的entityManager.remove()执行..
现在我无法理解.. JPA / JTA不应该自动管理交易吗?
此外,稍后尝试将entityManager.getTransaction()。begin()(和commit()),它给了我试图管理手动事务的问题,而不是我不能..似乎是无限循环..
[编辑]:我在CMT上下文中工作,所以我被允许只使用EntityManager和EntityManagerFactory。我尝试过使用entityManager.getTransaction()。begin()和entityManager.getTransaction()。commit()并且它没有用。
[edit']:。getTransaction(EntityTransaction对象)不能在CMT上下文中使用,因此不起作用。
[edit'']:我已经通过适合CMT上下文的事务管理解决了交易问题:JTA + CMT要求我们用TRY-CATCH-FINALLY块来管理交易,在TRY主体中需要它将我们想要执行的操作放在数据库上,并且在其FINALLY主体中需要关闭EntityManager对象(em.close())。虽然,如上所述,我使用了em.createNativeQuery(),当失败时,抛出可捕获(在我的应用程序中捕获)异常;我真的需要在我的工作代码中进行回滚(使用.createNativeQuery()是临时的)并使用.persist()方法,所以我需要知道该怎么做以便能够捕获MySQLIntegrityConstraintViolationException 。
非常感谢!
IT SEEMS我已经解决了这个问题。
回滚使用.persist()(因此,丢弃createNativeQuery()),将em.flush()放在em.persist(my_entity_object)之后帮助我,一旦违反了唯一性约束(见上文) ,现在可以捕获引发的异常。有了可捕获的异常,我现在可以按照帖子开头的描述进行操作。
警告:我提醒您,我是JavaEE-JPA-JTA的新手。我一直很“幸运”因为,由于我缺乏知识,我把这个指令(em.flush())做了一个猜测(我不知道我怎么想)。因此,我无法解释这种行为;不过,我会理解可能发生的事情的解释,使用方法flush()的方法和时间,等等等等。
谢谢!