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