J'ai une application de démarrage MVC printanière avec une base de données MySQL et j'essaie d'obtenir un champ TEXT dans ma base de données. J'ai le code suivant:
Membre.Java
@Entity
public class Member {
private Long id;
private String name;
@Column(columnDefinition = "TEXT")
private String biography;
private String country;
private String state;
private String city;
private Date dateOfBirth;
private String gender;
//Getters and setters
application.properties
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.datasource.url=jdbc:mysql://localhost:3306/wave
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.h2.console.enabled=true
Et voici le Hibernate qu'il crée
Hibernate: drop table if exists member
Hibernate: create table member (id bigint not null auto_increment, biography varchar(255), city varchar(255), country varchar(255), date_of_birth date, gender varchar(255), name varchar(255), state varchar(255), primary key (id)) ENGINE=InnoDB
Il le définit toujours comme un varchar (255). Quelqu'un peut-il m'aider avec ce problème? Merci d'avance.
Vous pouvez utiliser @Lob
à partir de javax.persistence ... c'est plus élégant:
@Column
@Lob
public String getDescription() {...
Dans la classe org.hibernate.dialect.MySQLDialect
, il y a une ligne:
registerColumnType( Types.CLOB, 65535, "text" );
Donc, sur cette base, si vous définissez votre champ de la manière suivante:
@Column(length = 65535, columnDefinition = "text")
private String biography;
ça devrait faire l'affaire.
Le fait de quitter la définition de colonne pourrait résoudre le problème (annotez uniquement avec @Column
, hibernate est astucieux pour le résoudre), mais varchar
remplace le nom text
dans les versions les plus récentes des serveurs SQL. Il n'y a donc aucun inconvénient à utiliser varchar
. (255) est la longueur par défaut.