Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从代理类检索代理类?_Java_Hibernate - Fatal编程技术网

Java 如何从代理类检索代理类?

Java 如何从代理类检索代理类?,java,hibernate,Java,Hibernate,我将Hibernate与代理一起使用,我得到属于类的对象,例如test.DBUser$$enhancerbyglib$$40e99a2d 是否有Hibernate方法从代理类中检索基类(test.DBUser)?我知道关于Hibernate.getClass(),但它需要一个对象,而我正在寻找一个方法,该方法需要一个类类作为输入,比如test.DBUser$$EnhancerByCGLIB$$40e99a2d。“真正的落后阶级”的概念在大多数情况下没有多大意义。每次创建代理时,它都可以是Hibe

我将Hibernate与代理一起使用,我得到属于类的对象,例如
test.DBUser$$enhancerbyglib$$40e99a2d


是否有Hibernate方法从代理类中检索基类(
test.DBUser
)?我知道关于
Hibernate.getClass()
,但它需要一个
对象
,而我正在寻找一个方法,该方法需要一个
类作为输入,比如
test.DBUser$$EnhancerByCGLIB$$40e99a2d
。“真正的落后阶级”的概念在大多数情况下没有多大意义。每次创建代理时,它都可以是Hibernate定义的任何类的实例

你真正想要的是
{Class,Class}
的静态
Map
。我不相信有这样的事情,也不相信有必要这样做。只需查看Hibernate.getClass()的源代码:


进行静态映射查找以获得真正的类要便宜得多,但是Hibernate会一直使用惰性初始值设定项来获得实现类。

没有这样的方法。您需要自己编写一个helper类,以便从代理内部检索包装的对象和类信息。如果您只需要给定场景中的对象,请尝试删除所有延迟加载。然后Hibernate将为您提供普通对象


考虑尽量不需要该对象。也许您可以重新设计应用程序,以便不需要它,例如,在运行时添加一个包含所需信息的字段。

我发现,这比我想象的要容易:只需对代理类调用
getSuperclass()
,即可获得未经代理的原始类。我不确定这有多普遍,但它似乎可以工作。

虽然我真的很喜欢Flavio发布的方法的简单性,但我不能在生产代码中使用它,除非它被证明是受支持的。此外,如果您在LazyInitializer上调用.getImplementation(),它将强制初始化代理(如果尚未初始化),这将对性能产生负面影响。我提出了这种解决这两个问题的方法:

public static Class<?> getClassForHibernateObject(Object object) {
  if (object instanceof HibernateProxy) {
    LazyInitializer lazyInitializer =
        ((HibernateProxy) object).getHibernateLazyInitializer();
    return lazyInitializer.getPersistentClass();
  } else {
    return object.getClass();
  }
}
公共静态类getClassForHibernateObject(对象对象){
if(HibernateProxy的对象实例){
懒散初始化器懒散初始化器=
((HibernateProxy)对象);
返回lazyInitializer.getPersistentClass();
}否则{
返回object.getClass();
}
}

为什么您首先需要这个?代理扩展了您的基类,因此您可以在基类的实例上调用的每个方法也可以在代理上调用,并且将返回并执行相同的操作。我正在研究另一个关于将hibernate代理对象传递到GSON库的问题。该库通过代理
和代理
对象
进行一些调用,我希望能够开始对
进行一些操作。我不知道为什么有人对此投了反对票。在我看来,你的代码是正确的。我喜欢你透露这是实际的Hibernate代码。以下是你建议的链接:
public static Class<?> getClassForHibernateObject(Object object) {
  if (object instanceof HibernateProxy) {
    LazyInitializer lazyInitializer =
        ((HibernateProxy) object).getHibernateLazyInitializer();
    return lazyInitializer.getPersistentClass();
  } else {
    return object.getClass();
  }
}