JPA:如何将String保存到数据库字段中,键入MYSQL Text

Tha*_*ham 73 java mysql orm jpa

要求是用户可以写一篇文章,因此我选择mysql数据库中Textcontent字段类型.我怎样才能转换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
}
Run Code Online (Sandbox Code Playgroud)

在我的MYSQL数据库中,content是类型Text.我希望会有这样的东西java.sql.Text,因为它java.sql.Blob是一个真实的类型,但遗憾的是,这不存在

Pas*_*ent 123

由于您使用的是JPA,因此请使用Lob注释(以及可选的Column注释).以下是JPA规范所说的内容:

9.1.19 Lob注释

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

所以声明这样的事情:

@Lob 
@Column(name="CONTENT", length=512)
private String content;
Run Code Online (Sandbox Code Playgroud)

参考

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

  • 在Hibernate JPA MYSQL上,在String字段上使用`@Lob`加上`@ Column`注释会产生"错误的列类型,预期的longtext但列类型是文本".但是当我使用`@Column(columnDefinition ="text")`时,问题就解决了 (23认同)
  • 结合`@ Lob`和`@Column(length = 512)`有什么意义?为什么不对'@ Lob`感到满意?使用Hibernate JPA MySQL时,两者都没有区别.两者都导致MySQL字段类型为"longtext". (4认同)

Rei*_*unk 94

随着@Lob我总是LONGTEXT在MySQL中结束.

为了让TEXT我以这种方式声明它(JPA 2.0):

@Column(columnDefinition = "TEXT")
private String text
Run Code Online (Sandbox Code Playgroud)

找到这个更好,因为我可以直接选择列在数据库中的文本类型.

对于columnDefinition它也是良好的阅读.

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

  • 这不是一个好的解决方案,因为TEXT数据列在所有数据库引擎中都不可用,例如HSQLDB,详细信息:http://stackoverflow.com/questions/4213782/hibernate-postgresql-hsqldb-text-column-incompatibility-problem (4认同)

小智 20

对于mysql'text':

@Column(columnDefinition = "TEXT")
private String description;
Run Code Online (Sandbox Code Playgroud)

对于mysql'longtext':

@Lob
private String description;
Run Code Online (Sandbox Code Playgroud)