Отображение Oracle XMLType на JPA (EclipseLink) - PullRequest
4 голосов
/ 18 октября 2010

У нас есть проект с некоторыми особыми требованиями, одним из которых является получение данных из столбца базы данных XMLType из базы данных Oracle 10g.

Мы нашли простое решение с использованием JDBC, но оно могло бы сделать приложение немного грязным, поскольку весь доступ к данным осуществляется через JPA (используется реализация EclipseLink).

Мы провели некоторое исследование и нашли некоторые решения, такие как использование конвертеров и других вспомогательных типов, но реализации казались немного сложными.

Итак, мой вопрос:
Не могли бы вы порекомендовать мне простой способ сопоставления столбца данных XMLType с типом объекта Java с использованием JPA?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 20 октября 2010

Я думаю, что было бы хорошо поделиться полным решением, полученным в результате ответа Джеймса.

Сначала создайте DescriptorCustomizer имплементацию:

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 (как показано в предыдущем фрагменте кода):

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

   private String xmlField;

   /* .... */ 
}

Атрибут xmlField не нуждается в аннотации @Column, так как его отображение определено в нашей реализации DescriptorCustomizer.

И вот оно.

2 голосов
/ 19 октября 2010

Вы пытались просто сопоставить его как строку?

В EclipseLink вы также можете сопоставить его с помощью DirectToXMLTypeMapping с помощью DescriptorCustomizer (пока не поддерживается аннотация) или использовать конвертер, как вы это сделали.

...