【问题标题】:Hibernate column annotation for TEXTTEXT 的休眠列注释
【发布时间】: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)。谁能帮我解决这个问题?提前谢谢你。

【问题讨论】:

    标签: java spring hibernate spring-boot jpa


    【解决方案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 列用于存储很长的文本或二进制文件。

      我们可以选择两种吊球:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 2014-11-16
        • 2018-01-12
        • 2012-09-11
        相关资源
        最近更新 更多