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

Hibernate session.contains(Class clazz,Serializable id)

和季
2023-03-14
问题内容

我希望能够检查会话是否包含给定类/标识符的实体。目前,我看不到这样做的方法。

  • contains() 需要一个实体对象而不是类+键
  • get() 查询数据库,如果该实体不存在我不想做
  • load() 永远不会返回null,因为始终会创建代理,因此我无法使用此方法

是否可以对DB进行上述操作而没有副作用/查询?


问题答案:

回答我自己的问题。

我认为使用公共API不可能做到这一点。但是,如果您愿意忍受一些奶酪,则可以执行以下操作

        SessionImplementor sessionImplementor = ((SessionImplementor)session);
        EntityPersister entityPersister = sessionImplementor.getFactory().getEntityPersister( clazz.getName() );
        PersistenceContext persistenceContext = sessionImplementor.getPersistenceContext();

        EntityKey entityKey = new EntityKey( id, entityPersister, EntityMode.POJO );

        Object entity = persistenceContext.getEntity( entityKey );

        if ( entity != null )
            return entity;

        entity = persistenceContext.getProxy( entityKey );

        if ( entity != null )
            return entity;

        return null;

这依赖于hibernate的内部API,因此如果内部进行更改,将来可能无法使用。



 类似资料:

相关阅读

相关文章

相关问答