如何在 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 中持久化字符串列表?的主要内容,如果未能解决你的问题,请参考以下文章