JPA: ¿cómo persisto una cadena en un campo de base de datos, escriba texto MYSQL?

83

El requisito es que el usuario pueda escribir un artículo, por lo tanto, elijo el tipo Textpara el contentcampo dentro de la base de datos mysql. ¿Cómo puedo convertirme Java StringenMySQL Text

Aqui tienes Jim Tough

@Entity
public class Article implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long userId;

    private String title;

    private String content;

    private Integer vote;

    //Constructors, setters, getters, equals and hashcode
}

En mi base de datos MYSQL, contentes type Text. Tenía la esperanza de que hubiera algo así java.sql.Text, ya que java.sql.Blobes un tipo real, pero lamentablemente, eso no existe.

Thang Pham
fuente

Respuestas:

132

Ya que está usando JPA, use la Lobanotación (y opcionalmente la Columnanotación). Esto es lo que dice la especificación JPA al respecto:

9.1.19 Anotación de globo

Una Lobanotación especifica que una propiedad o campo persistente debe conservarse como un objeto grande en un tipo de objeto grande compatible con la base de datos. Las aplicaciones portátiles deben usar la Lobanotación al mapear a un tipo de base de datos Lob. La anotación Lob se puede utilizar junto con la Basicanotación. Un Lob puede ser de tipo binario o de carácter. El tipo Lob se infiere del tipo de campo o propiedad persistente y, excepto para los tipos basados ​​en cadenas y caracteres, el valor predeterminado es Blob.

Así que declara algo como esto:

@Lob 
@Column(name="CONTENT", length=512)
private String content;

Referencias

  • Especificación JPA 1.0:
    • Sección 9.1.19 "Anotación lob"
Pascal Thivent
fuente
25
En Hibernate JPA MYSQL, el uso de la anotación @Lobmás @Columnen un campo de cadena da "tipo de columna incorrecto, texto largo esperado pero el tipo de columna es texto". Pero el problema se resuelve cuando lo usé@Column(columnDefinition = "text")
gerrytan
4
¿Qué sentido tiene combinar @Loby @Column(length=512)? ¿Por qué no simplemente ser feliz con @Lob? Ambos no hacen ninguna diferencia al usar Hibernate JPA MySQL. Ambos dan como resultado el tipo de campo MySQL longtext.
Sócrates
Tenía un tipo de columna binaria y la @Lobanotación no me funcionó. Sin embargo, @Column(length=8192)funcionó muy bien y resolvió mi problema.
Yanni
110

Con @Lobsiempre termino con un LONGTEXTen MySQL.

Para conseguirlo, TEXTlo declaro de esa manera (JPA 2.0):

@Column(columnDefinition = "TEXT")
private String text

Encuentre esto mejor, porque puedo elegir directamente qué tipo de texto tendrá la columna en la base de datos.

Porque columnDefinitiontambién es bueno leer esto .

EDITAR: Preste atención al comentario de Adam Siemions y verifique el motor de base de datos que está utilizando, antes de presentar la solicitud columnDefinition = "TEXT".

Reitffunk
fuente
4
Esta no es una buena solución, ya que la columna de datos TEXT no está disponible en todos los motores de bases de datos, por ejemplo, HSQLDB, detalles: stackoverflow.com/questions/4213782/…
Adam Siemion
1
esto es lo que quería porque es lo que está disponible en todas las bases de datos de producción y no tiene el problema con "texto largo" cuando no lo quiero.
Nicholas DiPiazza
29

para mysql 'texto':

@Column(columnDefinition = "TEXT")
private String description;

para mysql 'longtext':

@Lob
private String description;
Maxpan
fuente