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 文本的主要内容,如果未能解决你的问题,请参考以下文章

如何克隆 JPA 实体

如何使用 JPA 持久化 LocalDate?

使用 EclipseLink JPA 将 XML 类型存储到 PostgreSQL

cas 持久化TGT到mysql JPA方式 增加自定义字段

java中transient的用法

JPA 脏检查