【问题标题】:How can I define 'TEXT' type using eBean in Play! framework?如何在 Play 中使用 eBean 定义“TEXT”类型!框架?
【发布时间】:2012-09-10 03:30:10
【问题描述】:

当我将 Model 类中的变量定义为 String 时,它在 DB 中被转换为 'VARCHAR(255)'。

但是,我想保存超过 255 个,因为这些数据是由几个段落组成的很长的文本。

据我所知,DB 中有一个 TEXT 类型可以保存很长的文本。

如何在 Play 中定义 TEXT 类型!框架?

我尝试了 Play 中定义的 Constraints.MaxLength 和 Constraints.Max!框架接口。

但是,仍然是 1.sql 文件(由 Ebean DDL 自动创建)将此变量定义为 VARCHAR(255)。

谢谢,提前!

【问题讨论】:

    标签: database playframework-2.0 ebean


    【解决方案1】:

    在您的模型中,只需使用设置为TEXT 的列定义:

    @Entity
    public class MyEntity extends Model {
    
        @Id
        private Long id;
    
        @Column(columnDefinition = "TEXT")
        private String aLongText;
        ....
    
    }
    

    我已经在Postgres上使用过,不知道其他数据库服务器是否可以。

    【讨论】:

    • 例如对于 Oracle 来说是不正确的。另一种选择是“Clob”
    【解决方案2】:

    您可以在字段上使用 @Lob 注释,这将在 MySQL 上产生 longtext 类型,在 PostgreSQL 上产生 text 类型:

    package models;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Lob;
    
    @Entity
    public class Foo {
    
        @Id
        public Long id;
    
        @Lob
        public String bar;
    
    }
    

    在 MySQL 中,这会产生:

    mysql> describe foo;
    +-------+------------+------+-----+---------+----------------+
    | Field | Type       | Null | Key | Default | Extra          |
    +-------+------------+------+-----+---------+----------------+
    | id    | bigint(20) | NO   | PRI | NULL    | auto_increment |
    | bar   | longtext   | YES  |     | NULL    |                |
    +-------+------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec) 
    

    在 PostgreSQL 中,这会产生:

    foodb=> \d foo;
         Table "public.foo"
     Column |  Type  | Modifiers
    --------+--------+-----------
     id     | bigint | not null
     bar    | text   |
    Indexes:
        "pk_foo" PRIMARY KEY, btree (id)
    

    根据Java EE api

    Lob 类型是从持久字段或属性的类型推断出来的

    这意味着String 类型的字段应该给你一些文本块,而byte[] 类型的字段应该给你一些二进制块。

    【讨论】:

    • 我首先尝试了这个答案,但截至 2017 年 2 月 2 日,使用 Ebean 9.3.1 和 MySQL 5.7.17,@Lob 产生 longblob 而不是 longtext。这适用于 UTF-8 吗?我想我会用@Column(columnDefinition = "TEXT") 来代替特定的数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多