小编典典

在不检查@Id的情况下确定实体是否是新的

hibernate

有没有一种方法可以确定给定的示例实体类:

@Entity
class A {

    String name;

}

boolean method(Object anyEntity) {
     // How can I check here, if this entity is completely new    
}

所谓“新”,是指有人调用了新的A()甚至可能设置了名称,但从未保存或保留。

通常,人们可以检查id,但是我想要一种不需要id或getId()方法的解决方案。

基本上,即使在分离模式下,此实体也已持久化到数据库中。

@Version或getVersion也不是令人满意的解决方案。

也许是独立的|| isAttached可能有效,但是我不确定如何在Hibernates API上进行该调用。

编辑:

还需要澄清的是,我不控制实体,因此无法向其添加任何字段。解决方案应尝试利用底层机制来确定这一点。


阅读 224

收藏
2020-06-20

共1个答案

小编典典

经过一些工作和对Hibernate源代码的分析,我相信这是答案:

boolean isNew(T entity) {
        return ((SessionImplementor) session()).getPersistenceContext().getEntry(entity) == null;
}

另外要注意的是,在不依赖实现的情况下获取ID可以通过以下方式完成:

    boolean hasId(Object entity) {
            return getId(entity) != null;
    }

    Serializable getId(Object entity) {
            ClassMetadata metadata = metadata(entity);
            if ( metadata.hasIdentifierProperty() ) {
                    return metadata.getIdentifier(entity);
            }
            return null;
    }

    ClassMetadata metadata(Object entity) {
            return getRepository().session().getSessionFactory().getClassMetadata(entity.getClass());
    }
2020-06-20