2010-10-18 53 views
4

我們有一些特殊的要求,至極之一是從XMLType的數據庫列從Oracle 10g數據庫獲取數據的項目。映射的Oracle的XMLType在JPA(EclipseLink的)

我們發現使用JDBC一個簡單的解決方案,但它會驅動應用程序有些凌亂,因爲所有的數據訪問正在通過JPA完成(使用實施的EclipseLink)。

我們已經做了一些研究,並發現了一些解決方案,如使用轉換器和其他附配的類型,但實現似乎有點複雜。

所以,我的問題是:
你能推薦一種簡單的方法來使用JPA將XMLType數據列映射到Java對象類型嗎?

在此先感謝。

回答

2

你嘗試只是它映射爲一個字符串?

在EclipseLink的你也可以用它使用DescriptorCustomizer(沒有註解的支持還)一DirectToXMLTypeMapping,或使用轉換器爲你做了映射。

+0

感謝您的回答。目前,我的同事選擇將其映射爲String,並將數據庫中的列作爲CLOB類型獲取。但我仍然想知道是否有更直接的方式在Java層完成它。我會檢查你的解決方案。 – 2010-10-19 13:49:00

+0

最後,雖然在我看來這是實現它的正確方法,但我們將繼續使用Clob解決方法。無論如何謝謝@詹姆斯。 – 2010-10-20 10:39:59

+0

clob解決方法,你是如何得到它的工作 – 2014-04-30 16:09:16

2

我認爲,這將是罰款分享從詹姆斯的回答得到的完整的解決方案。

首先,創建一個DescriptorCustomizer implmentation:

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 anotation的實體,爲EntityManager處理稱爲xmlField財產時使用它(如在上面的代碼片段所示):

@Entity 
@Table(name="TABLE_NAME") 
@NamedQueries({ /* ... */}) 
@Customizer(XMLDataCustomizer.class) 
public class DataEntity implements Serializable { 
    /* ... */ 

    private String xmlField; 

    /* .... */ 
} 

xmlField屬性不需要@Column anotation,因爲它映射在OU定義r DescriptorCustomizer執行。

就是這樣。

+0

那麼這個appoach會給你買什麼? xmlField仍然是java土地上的一個字符串? – 2014-04-30 14:29:20