【问题标题】:JPA - How to set string column to varchar(max) in DDLJPA - 如何在 DDL 中将字符串列设置为 varchar(max)
【发布时间】:2013-05-01 02:55:04
【问题描述】:

使用JPA,为属性生成 DDL:

@Column
final String someString;

将是someString varchar(255) null

@Column(length = 1337)
final String someString;

将产生someString varchar(1337) null

但是我怎样才能让它产生someString varchar(max) null

是否可以使用length-属性,还是我需要使用columnDefinition-属性?

【问题讨论】:

    标签: java sql-server hibernate jpa ddl


    【解决方案1】:

    几个月过去了,获得了新知识,所以我将回答我自己的问题:

    @Lob
    @Column
    final String someString;
    

    产生最正确的结果。对于我正在使用的hbm2ddl 版本,这将转换为textSqlServerDialect 类型。由于varchar(max) is the replacement for textSQL Server 的较新版本中,希望hbm2ddl 的较新版本将产生varchar(max) 而不是text 用于这种类型的映射(我现在被困在一个相当过时的Hibernate 版本中..)

    【讨论】:

    • 提供将文本 lob 映射到 varchar(max) 的自定义 SQLServerDialect 也可以解决问题,但尚未尝试。
    【解决方案2】:

    由于 length 在 JPA 规范和 javadocs 中定义为 int 类型并且 max 不是 int ,因此可以安全地假设您被委托给 columnDefinition 依赖于数据存储的路由。但是varchar(max) 无论如何都是依赖于数据存储的。

    【讨论】:

    • 项目大文本中的其他地方用@Lob注释,这导致text SQL-datatype。也会这样做..
    【解决方案3】:

    您好,下面的代码解决了同样的问题

    @Column(columnDefinition="TEXT")
    
    @Lob
    
    final String someString;
    

    【讨论】:

    • 这对现有答案没有任何改进,它具有相同的 @Lob 和 columnDefinition,并且使用 columnDefinition 不必要地破坏了可移植性。
    【解决方案4】:

    使用@Size(max = 1337)。它确实会生成varchar(1337)

    【讨论】:

    【解决方案5】:

    您可以使用此代码 -

    型号代码:

    @NotNull  
    @Length(max = 7)  
    @Column(name = "Gender")  
    private String gender;
    

    SQL 输出类似于 -

    > gender varchar(7)
    

    【讨论】:

    • 你没有回答问题,只是重复了部分问题。
    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多