JPA:如何将字符串保留到数据库字段中,键入MYSQL Text


80

要求是用户可以写一篇文章,因此我Textcontentmysql数据库中的字段选择类型。我如何转换Java StringMySQL Text

干得好 Jim Tough

@Entity
public class Article implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long userId;

    private String title;

    private String content;

    private Integer vote;

    //Constructors, setters, getters, equals and hashcode
}

在我的MYSQL数据库中,content类型为Text。我希望会有这样的东西java.sql.Text,因为这java.sql.Blob是一个实际的类型,但可惜的是,这并不存在

Answers:


130

由于您使用的是JPA,因此请使用Lob注释(和可选的Column注释)。这是JPA规范对此的说明:

9.1.19吊球注释

Lob注释指定持久性属性或字段应保持为一个大型对象到数据库支持的大对象类型。可移植应用程序Lob在映射到数据库Lob类型时应使用 注释。Lob注释可以与Basic注释结合使用 。Lob可以是二进制或字符类型。Lob类型是从持久字段或属性的类型推断出来的,除了基于字符串和字符的类型外,默认为Blob。

因此,声明如下:

@Lob 
@Column(name="CONTENT", length=512)
private String content;

参考文献

  • JPA 1.0规范:
    • 第9.1.19节“ Lob注释”

25
Hibernate的JPA MYSQL,使用@Lob加上@Column一个字符串字段批注给“错列式,预计LONGTEXT但列类型是文本”。但是当我使用时,问题就解决了@Column(columnDefinition = "text")
gerrytan

4
结合@Lob和有@Column(length=512)什么意义?为什么不只是满意@Lob呢?使用Hibernate JPA MySQL时,两者都没有区别。两者都导致MySQL字段类型longtext
苏格拉底

我有一个二进制列类型,并且@Lob注释对我不起作用。但是,@Column(length=8192)工作很棒,解决了我的问题。
扬尼

106

随着@Lob我总是最后一个LONGTEXT在MySQL。

为了得到TEXT我这样声明(JPA 2.0):

@Column(columnDefinition = "TEXT")
private String text

找到更好的方法,因为我可以直接选择该列在数据库中将具有哪种Text-Type。

对于columnDefinition它也是良好的阅读

编辑:在应用之前,请注意Adam Siemions注释并检查您正在使用的数据库引擎columnDefinition = "TEXT"


4
这不是一个很好的解决方案,为TEXT数据列是不是在所有可用的数据库引擎,如HSQLDB,细节:stackoverflow.com/questions/4213782/...
亚当·锡米恩

1
这就是我想要的,因为它是所有生产数据库中都可用的,并且当我不需要它时,“ longtext”没有问题。
Nicholas DiPiazza 2015年

25

对于mysql'text':

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

对于mysql'longtext':

@Lob
private String description;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.