【问题标题】:Is there a less expensive method to do the following primary key validation in hibernate在hibernate中进行以下主键验证是否有更便宜的方法
【发布时间】:2011-08-04 09:01:19
【问题描述】:

我需要确保我正在创建的新供应商部件不存在。目前是这样完成的

try {
    entityManager.get(SupplierPartEntity.class,
    new SupplierPartPK(supplierID, partID));

    throw new CreateSupplierPartActionException("Supplier part record exists for " + supplierID
    + " / " + partID + ".");
} catch (final RecordNotFoundException e) {
    /* supplier part not found - do nothing */
}

值得注意的是,当get()正常返回null时,entityManager会抛出一个record not found异常;

【问题讨论】:

    标签: hibernate jakarta-ee ejb-3.0 jboss5.x


    【解决方案1】:

    如果“较便宜”的意思是“不会访问数据库”,那么不会,除非您在内存中保留所有现有主键的缓存。除此之外,数据库是唯一知道它们的东西。

    【讨论】:

    • 我知道数据库命中是必需的,试图避免一个空的 catch 块,因为它是逻辑遵循的预期路径。
    • 这是性能问题还是代码风格问题?如果性能,除非分析器告诉您有问题,否则不要担心。如果是代码风格,请在您的 entityManager 中添加一个方法,该方法封装了“这个东西是否存在”逻辑。
    • 谢谢,我读到空的 catch 块是一种不好的做法,并试图找到一种更优雅的方法。我会看看封装“这是否存在”它仍然使用 entiyManager.find(Class.class, PK) 并检查 null 但返回一个布尔值。
    • 是的,空的捕获块将被蔑视、羞辱,并被磨成不存在。我第一次没有完全理解你的意思。您有一个似乎不需要内容的 catch 块这一事实表明抽象是不适当的。将代码推送到“存在检查”方法中可能是适当的操作。
    • 我认为这更像是一种适当的抽象(检查记录并在未找到时抛出异常)被滥用为“标准”模式的情况。
    【解决方案2】:

    您似乎在使用 SupplierID 和 Part ID 作为主键来强制唯一性?

    为什么不继续尝试创建新记录并在/如果发生唯一性约束违规时捕获它? (抱歉,该项目已经存在)

    【讨论】:

    • 认为(可能是错误的)处理非唯一约束的开销会更多,因为它会在数据库中抛出 SQL 异常,包装在 ORM 中抛出的休眠异常中(生成的堆栈跟踪)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多