TEXT 的休眠列注释

Posted

技术标签:

【中文标题】TEXT 的休眠列注释【英文标题】:Hibernate column annotation for TEXT 【发布时间】:2017-09-15 22:39:58 【问题描述】:

我有一个带有 mysql 数据库的 Spring MVC 启动应用程序,我正在尝试在我的数据库中获取一个 TEXT 字段。我有以下代码:

会员.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

这是它创建的 Hibernate

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

它仍然将其设置为 varchar(255)。谁能帮我解决这个问题?提前谢谢你。

【问题讨论】:

【参考方案1】:

保留列定义可以解决问题(只能用@Column注释,hibernate很聪明的解决了),但varchar是在较新版本的sql server中替换text,所以我认为有使用varchar 没有错。 (255) 是默认长度。

【讨论】:

遗憾的是,仅使用 Column 进行注释也不起作用,它仍然提供 varchar。我认为如果它仍然是 varchar 会很奇怪。如何在数据库中获得超过 255 个字符?【参考方案2】:

org.hibernate.dialect.MySQLDialect 类中有一行:

registerColumnType( Types.CLOB, 65535, "text" );

因此,如果您像这样定义您的字段:

@Column(length = 65535, columnDefinition = "text")
private String biography;

它应该可以解决问题。

【讨论】:

遗憾的是它仍然返回一个 varchar。 尝试显式添加@Type(type="text") 它仍然在数据库中给了我一个 varchar。 正如here 所指出的,您应该在字符串变量上使用@org.hibernate.annotations.Type( type = "text" )。尝试在变量上而不是在 getter 上 像魅力一样工作。先使drop table生效。【参考方案3】:

你可以从javax.persistence使用@Lob...更优雅:

@Column
@Lob
public String getDescription() ...

【讨论】:

【参考方案4】:

可以作为@Lob注解使用,作为@Column(columnDefinition="TEXT")

@Lob
private String someField;

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

这里是阅读更多内容的链接: JPA Annotation for the TEXT Type

【讨论】:

使用@Column(columnDefinition = "TEXT") 有效。【参考方案5】:

@Column(columnDefinition = "TEXT") 私人字符串传记;

你可以用上面的代替

@Lob
@Column(name = "biography")
private String biography;

LOB: 顾名思义,lob 是一个大对象。在数据库术语中,lob 列用于存储很长的文本或二进制文件。

我们可以选择两种吊球:

    CLOB – 用于存储文本的字符 lob。 BLOB – 可用于存储二进制数据的二进制 lob 我们可以使用 JPA @Lob 注解将大型字段映射到大型数据库对象类型。

注意 当我们在 String 类型属性上使用 @Lob 记录时,JPA 规范规定持久性提供程序应该使用大字符类型对象来存储属性的值。因此,PostgreSQL 可以将字符 lob 转换为 TEXT 类型。

【讨论】:

以上是关于TEXT 的休眠列注释的主要内容,如果未能解决你的问题,请参考以下文章

在 postgresql 中使用休眠注释设置列的默认值

休眠一对多映射注释问题

带有休眠注释的模式导出

字节 [] 的正确休眠注释

如何使用注释创建休眠复合键

休眠注释:实体没有默认构造函数