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 的休眠列注释的主要内容,如果未能解决你的问题,请参考以下文章