[RESOLVIDO] Tipo de Dados XML do SQL Server e sua conversão p/ JPA - Hibernate

Galera, primeiro post aqui no GUJ e logo de cara venho pedir auxílio. :smiley:

Tenho o seguinte cenário: no meu banco de dados - SQL Server 2005 - tenho uma entidade com um campo (apresentacaoXML) que, como o nome sugere, tem tipo de dados XML mesmo.
Do lado do Java, no meu Entity Bean, este atributo está mapeado como um byte[] e, feitas as devidas anotações da JPA, ao persistir este atributo, recebo uma exception conforme trechos do stack que coloquei abaixo:

...
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

Caused by: org.hibernate.exception.DataException: could not update: [br.com.teste.Publicacao#1020]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:100)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2453)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:504)
… 62 more
Caused by: java.sql.SQLException: Operand type clash: image is incompatible with xml
at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2816)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2254)
at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:631)
at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:584)
at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:546)
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:505)
at net.sourceforge.jtds.jdbcx.proxy.PreparedStatementProxy.executeUpdate(PreparedStatementProxy.java:75)
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:251)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2431)
… 73 more

Alguém já lidou com este problema “SQLException: Operand type clash: image is incompatible with xml” em alguma situação similar?

Dei uma procurada aqui no fórum, mas não consegui encontrar - caso já tenha sido discutido, peço desculpas por não ter sido efetivo na busca.

Só para auxiliar, aqui segue trecho do meu Entity Bean de Publicação:

@Entity( name = "Publicacao" )
@Table( name = "Atividades_Publicacoes" )
public class Publicacao implements java.io.Serializable {

	@Id
	@GeneratedValue( strategy = GenerationType.IDENTITY )
	@Column( name = "id", nullable = false, insertable = true, updatable = true )
	private Long id;
	
	@Basic( optional = true )
	@Lob
	@Column( name = "apresentacaoXML", insertable = true, updatable = true )
	private byte[] apresentacaoXML; 
	
	/*
	 * getters, setter e outros atributos abstraídos para facilitar na visualização
         */

Obrigado galera, tudo de bom!

cara,

seu campo apresentacaoXML tem que ficar assim

        @Basic( optional = true )
	@Lob
	@Column( name = "apresentacaoXML", insertable = true, updatable = true )
	private byte[] apresentacaoXML; 

t+

Ops, desculpem o vacilo, ele já está como byte[], eu colei o trecho de código errado onde estava fazendo um teste com String…

No meu código original (com problema), o meu apresentacaoXML já está com byte[] mesmo, conforme sugerido pelo alissonvla.

private byte[] apresentacaoXML;   

Desconsiderem somente o tipo String do primeiro exemplo … :oops:

cara,
da uma olhada nesse link http://www.javeiro.com/2011/08/novidades-da-jdbc-4.html
agora eu nao sei como se faz isso com JPA.

t+

cara,
achei isso ai tbm http://stackoverflow.com/questions/3064330/how-to-map-xmltype-with-jpa-hibernate
pode ser uma solução.

espero te ajudar
t+

Obrigado alissonvla, suas informações foram muito úteis e ajudaram bastante!

Inclusive, embasado no link a respeito do acréscimo do tipo SQLXML no JDBC aprofundei no assunto e pesquisei bastante sobre o ORM deste novo tipo - embora acredito que com o tempo mais informações sobre isto aparecerão na net.

Sobre a solução do meu problema, fiz a que trouxe menos impacto:

Alterei meus atributos para String no meu Entity Bean e mantive os mesmos byte[] em um DTO. Fiz algumas compressões destes XML e na hora de efetivamente persistir estes dados, o meu Translate de DTO para Entity Bean convertia tudo para String mesmo. (Inicialmente tudo funcionou legal).

Muito Obrigado pela atenção!