Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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/4/sql-server-2008/3.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
hibernate 5.0+;equinox 4.5.0和自定义用户类型_Hibernate_Jpa_Osgi_Equinox_Compositeusertype - Fatal编程技术网

hibernate 5.0+;equinox 4.5.0和自定义用户类型

hibernate 5.0+;equinox 4.5.0和自定义用户类型,hibernate,jpa,osgi,equinox,compositeusertype,Hibernate,Jpa,Osgi,Equinox,Compositeusertype,我能够让Hibernate 5.0 Osgi捆绑包在非托管JPA模式下与Equinox 4.5.0一起工作。但有一个问题,当我在一个实体中使用自定义用户类型(例如实现EnhancedUserType的TestTypeMapType)时,我会遇到以下异常: org.hibernate.MappingException: Could not determine type for: com.xxx.yyy.TestTypeMapType, at table: TestTable, for column

我能够让Hibernate 5.0 Osgi捆绑包在非托管JPA模式下与Equinox 4.5.0一起工作。但有一个问题,当我在一个实体中使用自定义用户类型(例如实现EnhancedUserType的TestTypeMapType)时,我会遇到以下异常:

org.hibernate.MappingException: Could not determine type for: com.xxx.yyy.TestTypeMapType, at table: TestTable, for columns: [org.hibernate.mapping.Column(testType)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:390)
当我从Hibernate源代码中检查SimpleValue.java时,我看到它正在使用org.Hibernate.internal.util.Reflecthelper创建类型信息,代码行如下

ReflectHelper.classForName(typeName);
ReflectHelper正在使用下面的行创建类型信息

try {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    if (classLoader != null) {
        return classLoader.loadClass(typeName);
    }
}
catch(Throwable ignore){}

return Class.forName(typeName);
classLoader.loadClass和Class.forName都会引发以下异常

java.lang.ClassNotFoundException: com.xxx.yyy.TestTypeMapType cannot be found by org.hibernate.core_5.0.2.Final
但是,如果我直接从创建EntityManagerFactory的捆绑包中执行ReflectHelper.classForName内容,我就可以成功地创建自定义UserType的类型信息。特别是对于下面的示例,行A和行B可以工作,但行C抛出异常

try {
    Class<?> typeClass = null;

    // A
    typeClass = Thread.currentThread().getContextClassLoader().loadClass("com.xxx.yyy.TestTypeMapType");

    // B
    typeClass = Class.forName("com.xxx.yyy.TestTypeMapType");

    // C
    typeClass = ReflectHelper.classForName("com.xxx.yyy.TestTypeMapType");
}
catch(Exception e){}
试试看{
Class-typeClass=null;
//A
typeClass=Thread.currentThread().getContextClassLoader().loadClass(“com.xxx.yyy.TestTypeMapType”);
//B
typeClass=Class.forName(“com.xxx.yyy.TestTypeMapType”);
//C
typeClass=ReflectHelper.classForName(“com.xxx.yyy.TestTypeMapType”);
}
捕获(例外e){}
我能做些什么,以便hibernate在osgi环境中发现我的自定义用户类型

PS:我对其他实体类、方言、jdbc驱动程序等没有问题,而且ReflectHelper.classForName也不推荐使用,建议使用ClassLoaderService或ClassLoaderAccess。它可能是冬眠虫吗


谢谢…

您需要使用此处描述的TypeContributor扩展点

示例如何在hibernate envers中完成:


注意:您应该在不直接或间接使用entity manager实例的捆绑包中注册类型contributor。否则,您的类型参与者将不会用于实体管理器创建。我花了很多时间调试这个。最好只为用户类型提供一个单独的捆绑包。

您需要使用此处描述的TypeContributor扩展点

示例如何在hibernate envers中完成:


注意:您应该在不直接或间接使用entity manager实例的捆绑包中注册类型contributor。否则,您的类型参与者将不会用于实体管理器创建。我花了很多时间调试这个。最好只为用户类型创建一个单独的捆绑包。

Hello exoz,已经有一段时间了,我面临着非常类似的问题,你找到了解决方案吗?Hello@isco,不幸的是,我无法让它工作,所以我继续前进,没有使用自定义用户类型。Hello exoz,已经有一段时间了,我面临着非常类似的问题,您找到解决方案了吗?您好@isco,不幸的是,我无法让它工作,所以我继续前进,没有使用自定义用户类型。