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

mom*_*omo 6 entity hibernate jpa

有没有办法确定给定的实例类:

@Entity
class A {

    String name;

}

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

新的,我的意思是有人调用新的A(),甚至可能设置名称,但从未保存或持久化.

通常可以检查id,但我想要一个不需要id或getId()方法的解决方案.

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

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

也许isDetached || isAttached可能有效,但我不知道如何在Hibernates API上进行调用.

编辑:

另外澄清,我不控制实体,所以我不能向它们添加任何字段.解决方案应该尝试利用底层机制来确定这一点.

mom*_*omo 0

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

boolean isNew(T entity) {
        return ((SessionImplementor) session()).getPersistenceContext().getEntry(entity) == null;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,在不依赖实现的情况下获取 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());
    }
Run Code Online (Sandbox Code Playgroud)