Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA EntityManager persist(),即使抛出错误,也会导致对象显示为分离_Java_Hibernate_Jpa_Persist_Hibernate Entitymanager - Fatal编程技术网

Java JPA EntityManager persist(),即使抛出错误,也会导致对象显示为分离

Java JPA EntityManager persist(),即使抛出错误,也会导致对象显示为分离,java,hibernate,jpa,persist,hibernate-entitymanager,Java,Hibernate,Jpa,Persist,Hibernate Entitymanager,你好,我有一个简单的刀与以下功能 public element createElement(Element e){ em.persist(e); em.flush(); return e; } 实体表在对上有一个唯一的约束(类型、值),我有一个测试如下: public void testCreateElement() throws DataAccessException { // Start with empty Element ta

你好,我有一个简单的刀与以下功能

    public element createElement(Element e){

    em.persist(e);
    em.flush();

    return e;
}
实体表在对上有一个唯一的约束(类型、值),我有一个测试如下:

    public void testCreateElement() throws DataAccessException {
        // Start with empty Element table

        Element e = new Element();
        e.setType(myType.OTHER);
        e.setValue("1");
        dao.createElement(e);

        e = new Element();
        e.setType(MyType.OTHER);
        e.setValue("1");
        try{
                // this should violate unique constraint of database.
                dao.createElement(e);
        } catch (Exception ex) {
            System.out.println(ex);
        }

        e.setValue("2");
        try{
            // I expect this to work as there is no element with these values.
            dao.createElement(e);
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
我的第一个捕获到的错误正如我所期望的那样发生,因为我知道我违反了约束,第二个try/catch就我而言不应该抛出错误,但它确实发生了,我得到的是:

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.mypackage.Element
因此,似乎在“e”上调用persist(),即使它没有被持久化,也会导致hibernate认为它是一个分离的实体

这是令人恼火的,因为处理ConstraintViolation异常的JSF前端正在使用这些函数,但故意保留对象,以便用户可以更改其中一个字段并重试,它们会得到分离的实体错误

这种行为是冬眠bug吗?因为我认为它不应该这样做?在道的层面上,有没有一种方法可以解决这一问题,从而使坚持赢得胜利;如果我的对象实际上没有持久化,你不会将其视为分离的吗

问候,


Glen x

Hibernate引发的异常无法恢复。发生此类异常时,您唯一应该做的事情就是回滚事务并关闭会话。发生此类异常后,会话(及其实体)的状态不稳定

如果要保留该元素的副本,请使用
merge()
而不是
persist()
,或者在持久化元素之前克隆该元素


请注意,异常是预期的,因为当Hibernate持续并刷新实体时,它首先生成一个ID并将ID分配给实体,然后插入导致异常的行。因此,在异常之后,实体分配了一个ID,因此Hibernate将其视为分离的实体。您可以尝试将ID重置为null并查看它是否有效,但我更希望在使用合并之前克隆实体。

仅对于GRIN,如果在调用的最后一个createElement之前创建一个新元素并设置正确的值,会发生什么情况?这有帮助吗?如果没有,这可能会起作用。。。e、 设定值(1);e=dao.createElement(e);(不,那没有帮助。你的代码正是我所做的,上面的代码是特意编写来演示我的问题的,它代表一个用户使用web前端来创建元素。我在我的原始帖子中也这么说过。