在调用merge之前检查实体是否存在

时间:2017-09-30 15:51:09

标签: jpa

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

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

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

1 个答案:

答案 0 :(得分: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和个人代码