当前位置: 首页 > 面试题库 >

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

冯育
2023-03-14
问题内容

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

@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也不是令人满意的html" target="_blank">解决方案。

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

编辑:

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


问题答案:

经过一些工作和对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());
    }


 类似资料:
  • 问题内容: 我有一台笔记本电脑,其Intel Core i5 M 450 @ 2.40GHz显然具有VT-x,但没有VT-d。我有32位的Ubuntu 12.04,但想在其上运行基于虚拟64位终端的Linux。我如何知道BIOS是否已激活该VT-x功能而无需重新启动? 问题答案: 您可以使用 RDMSR 从 MSR工具 读取寄存器 IA32_FEATURE_CONTROL (地址 0x3a )。为

  • 问题内容: 我想知道an 是否为空,但是没有使用方法。有没有办法知道它是否为空,而无需从中读取? 问题答案: 我想你在找。它不会告诉您它是否为空,但可以指示您是否要读取数据。

  • 问题内容: 这是@Jimt在Go中编写的工作程序和控制器模式的一个很好的示例, ” 但是此代码也有一个问题:如果要在退出时删除工作通道,则会发生死锁。 如果您使用,下次控制器写入该命令将导致恐慌,因为go无法写入一个已关闭的通道。如果您使用某些互斥锁来保护它,则由于它不会从通道读取任何内容,并且将阻止写入,因此互斥锁将导致死锁。您还可以为频道提供更大的缓冲,以解决此问题,但这还不够。 因此,我认为

  • 是否可以在没有实体的情况下使用JpaRepository?在这种情况下,将其替换为DTO。 如下示例所示 这种情况有替代方案吗? 注意:DTO已经映射,但我不想创建视图来将此DTO转换为实体。 我已经验证了这个主题,但没有重大进展,请使用无实体的JpaRepository交互样式 我在试这个 接口- 公共接口BffDTOInterface2{ } 我有这个错误

  • 问题内容: 我将实体添加到数据库中,并且工作正常。但是,当我检索列表时,会得到旧实体,直到取消取消部署应用程序并再次重新部署它之后,才会显示添加的新实体。这意味着默认情况下会缓存我的实体吗?但是,我没有在persistence.xml或任何此类文件中进行任何用于缓存实体的设置。 我什至尝试调用flush(),refresh()和merge()。但它仍然仅显示旧实体。我想念什么吗?请帮我。 问题答案

  • 这个问题用泛型约束标记为重复,where T:struct和where T:class和旧标题,它是。所以我更新了标题,以便更好地表达我的问题。我想问的是,如何调用泛型方法并仅在参数不为null的情况下才使用该参数,而不使用装箱。 一些为链接问题解释的变通方法可以用来回答这个问题,但我仍然相信这是一个根本不同的问题。