如何在 Hibernate 中持久化字符串列表?

Posted

技术标签:

【中文标题】如何在 Hibernate 中持久化字符串列表?【英文标题】:How to persist a List of Strings in Hibernate? 【发布时间】:2011-08-17 13:12:51 【问题描述】:

我似乎在 Hibernate 中映射列表时遇到问题。在我们的项目中有一个类Card 包含一个类Answer 和一个Answer 包含一个List<String>

Hibernate 是否可以使用注解映射List<String>?我的意思是,因为它没有@Entity 注释?

问候

【问题讨论】:

【参考方案1】:

如果您愿意将它们存储在与 JSON 相同的列中(mysql、PostgreSQL 也支持索引和二进制 JSON),您可以简单地使用 com.vladmihalcea/hibernate-types-52 库。

@TypeDefs(
    @TypeDef(name = "json", typeClass = JsonType.class)
)
public class YourEntity 
   @Column(nullable = false)
   @Type(type = "json")
   private List<String> fieldName = List.of();
   ...

查看完整指南here

【讨论】:

【参考方案2】:

使用@ElementCollection:

@ElementCollection
@CollectionTable(name="Nicknames", joinColumns=@JoinColumn(name="user_id"))
@Column(name="nickname")
public List<String> getNicknames()  ...  

来源: 7.2.3. Collections of basic types and embeddable objects

【讨论】:

只是一个问题:CollectionTable如果没有创建,会自动创建一个名为“Nicknames”的表吗? @BigDude 如果你让你的模式由休眠生成/更新,那么我猜是的。但是我使用hibernate已经快10年了:-) 你说得对,我试过了,如果我让 Hibernate 处理创建/更新过程,它将为我创建和更新CollectionTable 中定义的表:) 谢谢! @ThiagoSuchorski 我几乎从不使用关系数据库。但如果我这样做了,我可能会使用jooq。【参考方案3】:

试试

  @org.hibernate.annotations.CollectionOfElements(
        targetElement = java.lang.String.class
    )
    @JoinTable(
        name = "foo",
        joinColumns = @JoinColumn(name = "foo_id")
    )
    @org.hibernate.annotations.IndexColumn(
        name = "POSITION", base = 1
    )
    @Column(name = "baz", nullable = false)
    private List<String> arguments = new ArrayList<String>();

或见this detail example

【讨论】:

@deprecated use @ElementCollection

以上是关于如何在 Hibernate 中持久化字符串列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 JPA/Hibernate 映射 XMLType

Hibernate

hibernate中持久化对象的生命周期(转载)

JAVAEE学习笔记hibernate02:实体规则对象状态缓存事务批量查询和实现客户列表显示

在 Hibernate 中持久化对象,同时具有已知的主键。

Hibernate 注解