【问题标题】:Check entity existence before calling merge在调用合并之前检查实体是否存在
【发布时间】:2017-09-30 15:51:09
【问题描述】:

我有一个简单的抽象 DAO,我创建了以下方法:

protected T update(T entity) {
    return em.merge(entity);
}

实体只是在我的应用程序中使用@Entity 注释的任何对象。现在...如果您尝试更新不存在的对象,我想抛出异常。我打算在合并之前执行查找,如果查找操作返回 null 则抛出异常,如果实体存在则合并。如果有更好的方法可以做到这一点,我正在徘徊。

【问题讨论】:

    标签: jpa


    【解决方案1】:

    一种可能的解决方案:您可以根据主键进行检查。一个实体必须(应该?)有一个@Id 字段:

    @Entity
    public class Entity implements EntityInterface{
    
        @Id
        private Long id;
    
        @Override
        public Long getId(){
            return this.id;
        }
    
    }
    

    有界面

    public interface EntityInterface{
        public Long getId();
    }
    

    默认情况下,当你实例化你的实体时,id 为空,并且只有在持久化到数据库后才会分配一个值:id 将由你通过@GeneratedValue 定义的方法生成。因此,以下检查应满足您的要求:

    public abstract class AbstractService<T extends EntityInterface>{
    
        protected T update(T entity){
    
            // if by any chance you have to call this method on an entity with a null
            // primary key, it means that the entity has not been persisted in the
            // database yet
            if(entity.getId() == null){
                // or whatever
                return null;
            }
    
            return em.merge(entity);
        }
    
    }
    

    希望有帮助

    来源:JB Nizet's comment 和个人代码

    【讨论】:

    • 好的,但是假设您收到更新请求,例如通过 REST 或 WSDL。此更新请求与 ID 为 50 的实体相关,但您的数据库中没有具有此 ID 的行。如果您收到此请求会怎样?
    • ID是如何产生的?失败点显然是它无法处理任意ID。在 REST 接口的情况下,我假设客户端不会随机获取 ID,并且直接从该接口或从另一个接口获取的 ID 是从数据库中获取的。
    • 好吧,你说服了我!非常感谢!
    • 不客气。如果它可以帮助你,我的方法是“数据库总是说真话”,所以如果任何接口(REST、websocket、JSF ...)有数据差异,那么接口配置错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2012-11-03
    相关资源
    最近更新 更多