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

5 respostas
fernandoabcampos

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!

5 Respostas

A

cara,

seu campo apresentacaoXML tem que ficar assim

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

t+

fernandoabcampos

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:

A

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+

A

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+

fernandoabcampos

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!

Criado 28 de setembro de 2011
Ultima resposta 28 de set. de 2011
Respostas 5
Participantes 2