Java 在JPA上映射Oracle XMLType(EclipseLink)

Java 在JPA上映射Oracle XMLType(EclipseLink),java,jpa,eclipselink,xmltype,Java,Jpa,Eclipselink,Xmltype,我们有一个有一些特殊要求的项目,其中之一是从Oracle 10g数据库的XMLType数据库列获取数据 我们已经找到了一个使用JDBC的简单解决方案,但是它会让应用程序有点混乱,因为所有的数据访问都是通过JPA完成的(使用的实现是EclipseLink) 我们做了一些研究,并找到了一些解决方案,比如使用转换器和其他辅助类型,但实现似乎有点复杂 所以,我的问题是: 您能推荐一种使用JPA将XMLType数据列映射到Java对象类型的简单方法吗 提前感谢。您是否尝试将其映射为字符串 在Eclipse

我们有一个有一些特殊要求的项目,其中之一是从Oracle 10g数据库的XMLType数据库列获取数据

我们已经找到了一个使用JDBC的简单解决方案,但是它会让应用程序有点混乱,因为所有的数据访问都是通过JPA完成的(使用的实现是EclipseLink)

我们做了一些研究,并找到了一些解决方案,比如使用转换器和其他辅助类型,但实现似乎有点复杂

所以,我的问题是:
您能推荐一种使用JPA将XMLType数据列映射到Java对象类型的简单方法吗


提前感谢。

您是否尝试将其映射为字符串


在EclipseLink中,您还可以使用DirectToXMLTypeMapping和DescriptorUserMizer(目前还不支持注释)对其进行映射,或者像您所做的那样使用转换器进行映射。

我认为,分享James的答案所产生的完整解决方案是很好的

首先,创建一个
descriptorrcustomizer
实现:

import org.eclipse.persistence.config.DescriptorCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.mappings.xdb.DirectToXMLTypeMapping;

public class XMLDataCustomizer  implements DescriptorCustomizer {

    public void customize(final ClassDescriptor descriptor) throws Exception {
        descriptor.removeMappingForAttributeName("xmlField");
        DirectToXMLTypeMapping mapping = new DirectToXMLTypeMapping();
        mapping.setAttributeName("xmlField"); //name of the atribute on the Entity Bean
        mapping.setFieldName("XML_COLUMN"); //name of the data base column
        descriptor.addMapping(mapping);
    }

}
然后,您所要做的就是在实体上使用
@Customizer
选项,以便
EntityManager
在处理名为
xmlField
的属性时使用它(如前面的代码片段所示):

xmlField
属性不需要
@Column
anotation,因为它的映射是在我们的
描述符配置器
实现中定义的


就在这里。

谢谢你的回答。目前,我的同事选择将其映射为字符串,并从数据库中获取CLOB类型的列。但我仍然想知道是否有一种更直接的方法可以在Java层实现它。我将检查您的解决方案。最后,尽管我认为这是实现它的正确方法,但我们将继续进行Clob解决方案。无论如何谢谢@James.那么这个方法给你带来了什么?xmlField在java世界中仍然是一个字符串??
@Entity
@Table(name="TABLE_NAME")
@NamedQueries({ /* ... */})
@Customizer(XMLDataCustomizer.class)
public class DataEntity implements Serializable {
   /* ... */

   private String xmlField;

   /* .... */ 
}