2010-10-18 6 views
4

Nous avons un projet avec des exigences spéciales, dont l'une consiste à obtenir des données à partir d'une colonne de base de données XMLType à partir d'une base de données Oracle 10g.Mappage Oracle XMLType sur JPA (EclipseLink)

Nous avons trouvé une solution facile en utilisant JDBC, mais cela rendrait l'application un peu compliquée, car tout l'accès aux données se fait via JPA (l'implémentation utilisée est EclipseLink).

Nous avons fait quelques recherches, et avons trouvé des solutions, en utilisant des convertisseurs et d'autres types d'auxiliaires, mais les implémentations semblaient un peu compliquées. Donc, ma question est:
Pourriez-vous me recommander un moyen facile de mapper une colonne de données XMLType à un type d'objet Java, en utilisant JPA?

Merci d'avance.

Répondre

2

Avez-vous essayé de le mapper en tant que chaîne?

Dans EclipseLink, vous pouvez également le mapper en utilisant un DirectToXMLTypeMapping en utilisant un DescriptorCustomizer (pas encore de support d'annotation) ou en utilisant le convertisseur comme vous l'avez fait.

+0

Merci pour votre réponse. Actuellement, mes collègues ont opté pour mapper a a String, et obtenir la colonne de la base de données comme un type CLOB. Mais je veux quand même savoir s'il y a une façon plus directe de le faire au niveau Java. Je vais vérifier votre solution. –

+0

Enfin, même si à mon avis c'est la bonne façon de l'implémenter, nous allons aller de l'avant avec la solution de contournement de Clob. Merci quand même @James. –

+0

solution de contournement clob, comment avez-vous le faire fonctionner –

2

Je pense que ce serait bien de partager la solution complète résultant de la réponse de James.

Tout d'abord, créez un 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); 
    } 

} 

Ensuite, tout ce que vous devez faire est d'utiliser la @Customizer anotation sur l'entité, pour la EntityManager de faire usage lors de la manipulation de la propriété appelée xmlField (comme vu à l'extrait de code précédent):

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

    private String xmlField; 

    /* .... */ 
} 

l'attribut xmlField n'a pas besoin @Column anotation, car il est la cartographie est définie à UO r DescriptorCustomizer mise en œuvre.

Et voilà.

+0

alors qu'est-ce que cette appoach vous acheter? xmlField est toujours une chaîne en Java? –

Questions connexes