JPA:如何将字符串持久化到数据库字段中,键入 MYSQL 文本
Posted
技术标签:
【中文标题】JPA:如何将字符串持久化到数据库字段中,键入 MYSQL 文本【英文标题】:JPA: how do I persist a String into a database field, type MYSQL Text 【发布时间】:2011-04-21 13:14:57 【问题描述】:要求是用户可以写文章,所以我在mysql数据库中的content
字段中选择了Text
。如何将Java String
转换为MySQL 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
是一个实际的类型,但遗憾的是,它不存在
【问题讨论】:
【参考方案1】:由于您使用的是 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;
参考文献
JPA 1.0 规范: 第 9.1.19 节“Lob 注释”【讨论】:
在 Hibernate JPA MYSQL 上,在字符串字段上使用@Lob
加上 @Column
注释会给出“错误的列类型,预期的长文本,但列类型是文本”。但是当我使用@Column(columnDefinition = "text")
时问题就解决了
将@Lob
和@Column(length=512)
结合起来有什么意义?为什么不对@Lob
感到满意呢?在使用 Hibernate JPA MySQL 时,两者都没有区别。两者都导致 MySQL 字段类型 longtext
。
我有一个二进制列类型,@Lob
注释对我不起作用。但是,@Column(length=8192)
效果很好,解决了我的问题。【参考方案2】:
@Lob
在 MySQL 中我总是得到一个 LONGTEXT
。
为了获得TEXT
,我这样声明(JPA 2.0):
@Column(columnDefinition = "TEXT")
private String text
找到这个更好,因为我可以直接选择该列在数据库中的文本类型。
对于columnDefinition
,阅读this也很好。
编辑:在申请 columnDefinition = "TEXT"
之前,请注意 Adam Siemions comment 并检查您正在使用的数据库引擎。
【讨论】:
这不是一个好的解决方案,因为 TEXT 数据列并非在所有数据库引擎中都可用,例如HSQLDB,详情:***.com/questions/4213782/… 这是我想要的,因为它在所有生产数据库中都可用,并且当我不想要它时不会出现“longtext”的问题。【参考方案3】:对于 mysql '文本':
@Column(columnDefinition = "TEXT")
private String description;
对于 mysql 'longtext':
@Lob
private String description;
【讨论】:
以上是关于JPA:如何将字符串持久化到数据库字段中,键入 MYSQL 文本的主要内容,如果未能解决你的问题,请参考以下文章
使用 EclipseLink JPA 将 XML 类型存储到 PostgreSQL