Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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 Hibernate和UnuniqueObjectException_Java_Hibernate_Exception_Unique Constraint - Fatal编程技术网

Java Hibernate和UnuniqueObjectException

Java Hibernate和UnuniqueObjectException,java,hibernate,exception,unique-constraint,Java,Hibernate,Exception,Unique Constraint,我有一个实体,它包含另外两个具有@manytone关系的实体 @Entity public class A extends Serializable{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @ManyToOne @Cascade(CascadeType.SAVE_UPDATE) private B b; @ManyToOne

我有一个实体,它包含另外两个具有@manytone关系的实体

@Entity
public class A extends Serializable{

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @Cascade(CascadeType.SAVE_UPDATE)
    private B b;

    @ManyToOne
    @Cascade(CascadeType.SAVE_UPDATE)
    private C c;

}
如果我试图保存一个具有另一个A记录的“B_ID”和“C_ID”的A实例,则会出现异常:

org.hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联

例如:

A table
|   ID  |   B_ID    |   C_ID    |
|    1  |      1    |   null    |    // this works
|    2  |   null    |      1    |    // this works
|    3  |      1    |      x    |    // this throws the exception
|    4  |      x    |      1    |    // this throws the exception

x=any value of existent B/C_ID 
B_ID和C_ID在我的模型中不是唯一的,并且(B_ID+C_ID)不是唯一的约束

我能做什么


提前感谢。

Hibernate在这里并不是抱怨数据库的唯一性,而是抱怨当前的
会话
已经包含一个与您试图保存的新对象具有相同ID的对象。它不允许这样做-Hibernate有一个严格的要求,即给定的ID不能由单个会话范围内的两个不同对象表示


在某个时刻,应用程序已保存或加载具有相同ID的实体,并且该对象已在会话中“注册”。在这种特定的情况下,很难判断它在抱怨哪个ID,因为异常文本不清楚。尝试暂时删除级联指令,看看它是否仍然发生,尝试缩小范围

如有必要,您可以强制会话“忘记”给定ID的任何现有对象(使用Hibernate API中的
session.execit()
,或JPA 2.0 API中的
EntityManager.detach()
),但这不是一个非常优雅的解决方案


再次重申-此异常与数据库约束无关,它是关于Hibernate保护其内部内存状态的一致性。

谢谢,我从db加载的东西只有B和C,我在对象中使用它们。但是B和C有CascadeType.SAVE_UPDATE,所以它们不会再次保存,而只会更新。。。我希望…当会话是新的时,问题也会在开始时出现。删除级联指令效果很好,但是。。。为什么?在没有“Cascade.SAVE_UPDATE”的情况下,hibernate应该尝试重新保存数据库中已经存在的“A”和“B”,从而引发异常,但它可以工作。。。为什么?