2011-10-21 16 views
6

Tengo un EntityBean simple con una anotación @Lob. Si elimino esta anotación, no obtengo errores en JBossAS 6.0.0.Final y MySQL5. Pero si lo anoto con @Lob (porque mt contiene entre 100 y 5000 caracteres en mi caso) obtengo errores en mi entorno de prueba si persisto a la entidad.JBoss6 JPA: entidad con resultados @Lob en GenericJDBCException

  • sin @Lob: mt se asigna a VARCHAR
  • con @Lob: mt se asigna a LONGTEXT (esto es lo que quiero, pero tengo errores)

Esta mi entidad:

@Entity 
@Table(name = "Description") 
public class Description implements Serializable 
{ 
    public static final long serialVersionUID=1; 

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private long id; 

    @Lob 
    private String mt; 
} // ... getter/setter 

El error está aquí:

... 
Caused by: org.hibernate.exception.GenericJDBCException: could not insert 
    [my.Description] 
... 
Caused by: java.sql.SQLException: Connection is not associated with a managed 
    connec[email protected]3e4dd 
... 

Realmente no sé por qué obtengo este error (reproducible). El entorno parece estar bien, se pasan muchas otras pruebas e incluso funciona sin la anotación @Lob.

Esta pregunta está relacionada con JPA: how do I persist a String into a database field, type MYSQL Text, donde el uso de @Lob para JPA/MySQL es la respuesta aceptada.

Actualización 1 El error anterior es específico del sistema operativo. En una máquina W7 no tengo problemas con @Lob, con OSX Lion siempre aparece el error. Intentaré actualizar MySQL y el controlador.

Actualización 2 La solución propuesta por Kimi con @Column(columnDefinition = "longtext") funciona bien, incluso en OSX. En ambos casos, MySQL crea la misma columna: LONGTEXT.

Actualización 3 Actualicé MySQL a mysql-5.5.17-osx10.6-x86_64 y el conector a mysql-connector-java-5.1.18. Todavía el mismo error.

+2

¿Cómo es tu tabla de descripción de como? Si mt es varchar en su base de datos, ¿por qué querría tratar de asignarlo a un Lob? –

+0

¿Soporta MySQL5 LONGTEXT como valor correcto para crear un identificador? No estoy seguro de cómo debería hacer eso DB ... ¿incrementar el valor del texto? –

+0

@PedroKowalski mt no se utiliza como identificador. El campo de identificación es. Así es como lo leí al principio, pero es solo un formato pobre del código. –

Respuesta

4

No hay necesidad para anotar una propiedad de cadena con @Lob. Simplemente configure la longitud de la columna con @Column(length = 10000).

EDIT:

Por otra parte, siempre se puede ajustar la longitud a su valor máximo específico de base de datos, así como definir el tipo de columna con el ajuste columndefinition a cualquiera que se adapte a sus necesidades.

Por ejemplo, si estás usando MySQL 5.0.3 o posterior, la cantidad máxima de datos que pueden almacenarse en cada tipo de datos es el siguiente:

  • VARCHAR: 65.535 bytes (~ 64 Kb, 21844 UTF-8 caracteres codificados)
  • TEXTO: 65.535 bytes (~ 64Kb, 21.844 caracteres UTF-8 codificado)
  • MEDIUMTEXT: 16.777.215 bytes (~ 16Mb, ~ 5,5 millones de caracteres UTF-8 codificado)
  • LONGTEXT: 4,294,967,295 bytes (~ 4 GB, ~ 1,4 mil millones de caracteres codificados UTF-8).

Según tengo entendido, @Lob simplemente establece el tipo de columna y la longitud en función de la base de datos subyacente.

+0

¿Qué sucede si la Cadena tiene por alguna razón más de 10000 caracteres? Por favor, vea, http://stackoverflow.com/questions/3868096 – Thor

+2

Bueno, siempre puede establecer la longitud de su valor máximo específico de la base de datos, así como definir el tipo de columna con la configuración 'columndefinition' a la que se ajuste a sus necesidades. Por ejemplo, si está utilizando MySQL 5.0.3 o posterior, la longitud máxima para un VARCHAR codificado en UTF-8 es de 21,844 caracteres (65,535 bytes), que es el mismo que el límite del tipo de TEXTO. MEDIUMTEXT puede contener 16.777.215 bytes (~ 16 Mb, ~ 5,5 millones de caracteres) y LONGTEXT 4.294.967.295 bytes (~ 4 GB, ~ 1.400 millones de caracteres). Tal como lo entiendo, '@ Lob' simplemente establece el tipo y la longitud de la columna en algunos valores específicos de la base de datos. – Kimi

+0

Entonces, si la portabilidad no es un problema, me gustaría ir con esto. – Kimi

2

Otra forma en que trabajó para mí es actualizar la configuración de lanzamiento de jBoss con

-Dhibernate.jdbc.use_streams_for_binary=true 

estoy corriendo jBoss6 con MySQL5

Cuestiones relacionadas