Tim*_*sen 6 sql postgresql lob spring-data-jpa
我正在尝试使用@Lob具有 JavaString类型的列将其内容映射到TEXTPostgres 内部。这是相关实体:
@Entity(name="metadata")
public class Metadata {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "created_on")
@ColumnDefault(value="CURRENT_TIMESTAMP")
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Lob
@Column(name = "content")
private String content;
@Column(name = "draft")
private Boolean draft;
@OneToMany(cascade = javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "metadata")
private List<Attachment> attachments;
public void addAttachment(Attachment attachment) {
if (attachments == null) {
attachments = new ArrayList<>();
}
attachments.add(attachment);
attachment.setMetadata(this);
}
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
Metadata我有根据使用输入创建新实体的代码。我在 IntelliJ 调试模式下手动验证该实体是否已content设置为其预期值(恰好是 JSON 字符串)。但是,当我运行代码后检查 Postgres 时,我看到以下数据:
my_db=> select * from metadata;
id | content | created_on | draft
----+---------+-------------------------+-------
1 | 49289 | 2021-04-26 14:21:25.733 | t
(1 row)
Run Code Online (Sandbox Code Playgroud)
请仔细注意,奇怪的值49289出现在我们期望看到 JSON 字符串的地方。请注意,我还从命令行验证了所创建的表是否正确:
CREATE TABLE scarfon_attachment (
id bigint NOT NULL,
contents text,
filename character varying(255),
scarfon_id bigint NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
实体/表中的所有其他列都按预期工作。注释可能有什么问题@Lob。作为参考,我正在运行一个相当旧的 Postgres 版本(9.2),但它并不是那么古老。
我在这里的第一个疑问是由于许多来源提出了创建TEXT专栏的多种方法。例如,Baeldung 的这篇文章建议@Lob除了使用注释之外还使用定义@Column。
事实证明,@Lob并非所有数据库都对它进行相同的解释。对于 Postgres,仅@Lob单独使用将导致 Postgres 将列内容存储在不同的表中,并且该列注释为@Lob仅存储该表中每个条目的 ID。虽然这里建议通过注释指定正确的类型@Type可以解决这个问题,但我决定采用 Baledung 帖子的第二个建议,即使用@Column:
@Lob
@Column(columnDefinition="TEXT")
private String content;
Run Code Online (Sandbox Code Playgroud)
这工作得很好,并且生成的 Postgres 表具有TEXT预期的定义。上述唯一潜在的问题可能集中在其他 SQL 数据库的可移植性上,这些数据库可能不支持某种TEXT类型,或者可能支持某种替代方案。我没有对 Postgres 和 H2 之外的内容进行测试,但在这两种情况下,上述内容都可以正常工作。
| 归档时间: |
|
| 查看次数: |
5367 次 |
| 最近记录: |