JPA Map<String,String> 映射

Posted

技术标签:

【中文标题】JPA Map<String,String> 映射【英文标题】:JPA Map<String,String> mapping 【发布时间】:2010-10-25 13:58:15 【问题描述】:

如何在不使用 Hibernate 的类的情况下在 JPA 中映射 Map?

【问题讨论】:

【参考方案1】:

以下内容不适合您吗?

@ManyToMany(cascade = CascadeType.ALL)
Map<String,EntityType> entitytMap = new HashMap<String, EntityType>();

EntityType 可以是任何实体类型,包括String

【讨论】:

我有点困惑。问题是关于映射 Map,但“最佳答案”是关于 Map。我错过了什么吗? EntityType 可以是任何实体类型,包括字符串。 这会生成多少张表?是否有(1)一个用于原始类,(2)一个连接表(带有原始类和实体类型的键)和(3)另一个用于 EntityType 的表(在给定的场景中,一个只有连接的表表键和映射的字符串)?这可能会产生很多开销,具体取决于保存的字符串... @ChrisKaminski 您说 String 是实体类型是错误的,因为它没有 Id。你知道我的意思,你可能知道什么叫做实体。 对于字符串,字符串映射这将不起作用。建议取消选择为最佳答案。【参考方案2】:

假设我有一个名为 Book 的实体,它有一个章节地图:

import java.io.Serializable;
import java.util.Map;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;    
import org.hibernate.annotations.CollectionOfElements;
import org.hibernate.annotations.MapKey;
@Entity
public class Book implements Serializable
@Column(name="BOOK_ID")
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long bookId;    

@CollectionOfElements(targetElement=java.lang.String.class)
@JoinTable(name="BOOK_CHAPTER",
        joinColumns=@JoinColumn(name="BOOK_ID"))
@MapKey (columns=@Column(name="CHAPTER_KEY"))
@Column(name="CHAPTER")
private Map<String,String> chapters;
public Long getBookId() 
    return bookId;

public void setBookId(Long bookId) 
    this.bookId = bookId;

public Map<String,String> getChapters() 
    return chapters;

public void setChapters(Map<String,String> chapters) 
    this.chapters = chapters;
               


它对我有用。

【讨论】:

+1。如果我只想检索所有这些书籍的第 3 章怎么办?我有一个类似的问题:***.com/questions/12952625/… @ianaz select c from Book b join b.chapters c where key(c) = '3' 不幸的是,这需要特定于休眠的注释。问题是没有解决方案。【参考方案3】:

尽管 Subhendu Mahanta 给出的答案是正确的。但是@CollectionOfElements 已被弃用。您可以改用@ElementCollection

@ElementCollection
@JoinTable(name="ATTRIBUTE_VALUE_RANGE", joinColumns=@JoinColumn(name="ID"))
@MapKeyColumn (name="RANGE_ID")
@Column(name="VALUE")
private Map<String, String> attributeValueRange = new HashMap<String, String>();

无需为Map 字段创建单独的实体类。它会自动完成。

【讨论】:

【参考方案4】:

一个工作示例:

@ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name = "TABLENAME")
@MapKeyColumn(name = "KEY")
@Column(name = "VALUE")
public Map<String, String> getMap() 
    return _map;

【讨论】:

对于多对多关系,您还需要在@CollectionTable 和@MapKeyJoinColumn(name="referencing_column_other_table") 中使用joinColumns = @JoinColumn(name="referencing_column")

以上是关于JPA Map<String,String> 映射的主要内容,如果未能解决你的问题,请参考以下文章

jpa in查询

无法使用 JPA 注释映射哈希图

真正动态的 JPA CriteriaBuilder

具有多个输出参数的 JPA 2.1 @Procedure

JPA 通用 DAO

Spring Boot JPA 获取对 EntityManagerFactory 的引用