【问题标题】:Loading javassist-ed Hibernate entity加载 javassist-ed Hibernate 实体
【发布时间】:2009-07-16 18:58:49
【问题描述】:

我有一个 JSF 转换器,用于包含几种不同实体类型的 SelectItem 列表。在getAsString() 方法中,我将字符串创建为以“:”为后缀的类名和ID。

MySuperClass superClass = (MySuperClass)value;
if(superClass != null) {
  return String.valueOf(superClass.getClass().getName()+":"+superClass.getId());
}

这使我可以在从 UI 返回的途中在 getAsObject() 中加载正确的实体:

String className = value.substring(0, value.indexOf(":"));
long id = Long.parseLong(value.substring(value.indexOf(":")+1));
Class<T> entitySuperClass = (Class<T>) Class.forName(className);
MySuperClass superClass = (MySuperClass)getEntityManager().find(entitySuperClass, id);

我的问题是我在getAsString() 中的实体是代理。因此,当我执行 getClass().getName() 时,我没有得到com.company.MyEntity,而是得到了com.company.MyEntity_$$_javassist_48,所以它在find() 上失败了。

有没有办法(除了字符串操作)来获取具体的类名(例如 com.company.MyEntity)?

谢谢。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    试试org.hibernate.proxy.HibernateProxyHelper.getClassWithoutInitializingProxy(superClass),而不是superClass.getClass()

    【讨论】:

    • 我用过 ((HibernateProxy)entity).getHibernateLazyInitializer().getEntityName() 或 getPersistentClass() 但 HibernateProxy 包装了它,所以它可能是要走的路。
    • 或者简单的 Hibernate.getClass()
    • 很好的答案伙计们。这对我帮助很大。
    • 我希望您先发布答案@MichaelWiles。您的解决方案是最简单的,也是我使用的。
    【解决方案2】:

    Hibernate.getClass()HibernateProxyHelper 之间有一个重要区别! HibernateProxyHelper 总是返回代表数据库中表的超类,如果你有和使用映射的实体

    @Table(name = SuperClass.TABLE_NAME)
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = SuperClass.TABLE_DISCRIMINATOR, discriminatorType = DiscriminatorType.STRING)
    

    @DiscriminatorValue(value = EntityClass.TABLE_DISCRIMINATOR)
    

    在子类中。

    Hibernate.getClass(...) 返回那些真正的子类。

    【讨论】:

      【解决方案3】:

      结合抽象实体的继承(AbstractEntity ConcreteEntity ConcreteEntityProxy),仅仅获得持久化类是不够的:

      // This should fail - trying to create an abstract class
      HibernateProxyHelper.getClassWithoutInitializingProxy(superClass).newInstance()
      

      改为获取实现类:

      protected <T> T deproxy(T maybeProxy) {
          if (maybeProxy instanceof HibernateProxy) {
              return (T) ((HibernateProxy) maybeProxy).getHibernateLazyInitializer().getImplementation();
          }
          return maybeProxy;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2017-01-19
        • 2016-04-30
        • 1970-01-01
        • 2012-12-11
        • 2014-04-14
        相关资源
        最近更新 更多