JPA中@javax.persistence.Lob注解有啥意义?

Posted

技术标签:

【中文标题】JPA中@javax.persistence.Lob注解有啥意义?【英文标题】:What is the significance of @javax.persistence.Lob annotation in JPA?JPA中@javax.persistence.Lob注解有什么意义? 【发布时间】:2015-06-13 04:53:06 【问题描述】:

什么时候应该在 JPA 中使用 @javax.persistence.Lob 注释?这个注解可以注解哪些数据类型?

【问题讨论】:

【参考方案1】:

@javax.persistence.Lob 表示带注释的字段应在数据库中表示为 BLOB(二进制数据)。

您可以使用此注解来注解任何Serializable 数据类型。 在 JPA 中,在持久化(检索)后,字段内容将使用标准 Java 序列化进行序列化(反序列化)。

@Lob 的常见用途是在 Entity 中注释 HashMap 字段以存储一些未映射到 DB 列的对象属性。这样,所有未映射的值都可以以二进制表示形式存储在数据库中的一列中。当然,付出的代价是,由于它们以二进制格式存储,因此无法使用 JPQL/SQL 进行搜索。

【讨论】:

我们可以使用@Lob 来插入一些数据(一些带有很多图像的字符串)吗? 对于使用 SQL 查询创建的现有表,@Lob 有意义吗?当人们说“支持大型对象”时,我不明白幕后发生了什么。 @Zeilu【参考方案2】:

根据:https://docs.oracle.com/javaee/7/api/javax/persistence/Lob.html

@Lob 指定持久属性或字段应作为大对象持久保存到数据库支持的大对象类型。

@javax.persistence.Lob 表示注释字段应该是 在数据库中表示为 BLOB(二进制数据)。

我想在数据库中它不仅可以是二进制数据,还可以是基于字符的数据。 因为我们可以有 BLOB 和 CLOB。以下是java代码中的示例:

@Lob
@Column(name = "CHARS", columnDefinition = "CLOB")
private String chars;`

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "DATA", columnDefinition = "BLOB", nullable = false)
private byte[] data;

【讨论】:

在这种情况下,获取类型 Lazy 不起作用,因为您正在使用 byte[] 来存储数据。 没错! @Lob 用于映射Binary OR large character objects! 对于使用 SQL 查询创建的现有表,@Lob 有意义吗?当人们说“支持大型对象”时,我不明白幕后发生了什么。 @levrun

以上是关于JPA中@javax.persistence.Lob注解有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 中使用 JPA 域类

列名中的 JPA '.'(点)

JPA JPQL IN 子句:如何在 JPA 中使用 IN 子句?

JPA(Hibernate)

JPA/Spring/Hibernate/etc 中是不是有类似于 JPA 的 @PrePersist 允许更改相关实体的功能?

jpa实例