JPA EntityManager 如何确定一个实体是否已经存在?
How does JPA EntityManager determines if an entity already exists?
假设我有 EntityManager em
并且我有 Entity e
。当我调用 em.persist(e)
时,Java EE JPA 文档说如果 e
已经存在于持久性上下文中,则会抛出 EntityExistsException。
现在,假设类型 Entity
的实体有一个由数据库自动生成的代理键,但它们也有一个字段(或多个字段)具有唯一性约束,使任何类型的实体 Entity
独一无二。
EntityManager em
如何确定我要插入到数据库中的新元素已经存在?它是来自 Entity
中定义的 equals
方法,还是由于违反了某些唯一性约束而尝试插入数据库并返回错误? (很明显,我认为不应该是因为我插入的对象的代理主键等于数据库中对象的代理主键,因为我插入的对象的代理主键为空(或我的想法在这里是错误的?))。如果是后者,我怎么确定 persist
抛出的是 EntityExistsException
而不是 PersistenceException
?
除了执行 INSERT
并捕获数据库异常之外别无他法。由于数据库是多用户环境,任何其他方式都不可靠。
例如,oracle 抛出一个 "unique constraint violated" 并显示哪个
违反了约束条件。
QL Error: ORA-00001: unique constraint (SCHEMA_NAME.CONSTRAINT_NAME) violated
假设我有 EntityManager em
并且我有 Entity e
。当我调用 em.persist(e)
时,Java EE JPA 文档说如果 e
已经存在于持久性上下文中,则会抛出 EntityExistsException。
现在,假设类型 Entity
的实体有一个由数据库自动生成的代理键,但它们也有一个字段(或多个字段)具有唯一性约束,使任何类型的实体 Entity
独一无二。
EntityManager em
如何确定我要插入到数据库中的新元素已经存在?它是来自 Entity
中定义的 equals
方法,还是由于违反了某些唯一性约束而尝试插入数据库并返回错误? (很明显,我认为不应该是因为我插入的对象的代理主键等于数据库中对象的代理主键,因为我插入的对象的代理主键为空(或我的想法在这里是错误的?))。如果是后者,我怎么确定 persist
抛出的是 EntityExistsException
而不是 PersistenceException
?
除了执行 INSERT
并捕获数据库异常之外别无他法。由于数据库是多用户环境,任何其他方式都不可靠。
例如,oracle 抛出一个 "unique constraint violated" 并显示哪个 违反了约束条件。
QL Error: ORA-00001: unique constraint (SCHEMA_NAME.CONSTRAINT_NAME) violated