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

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

【问题讨论】:

    标签: java hibernate mapping persistence


    【解决方案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 章怎么办?我有一个类似的问题:stackoverflow.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")
      猜你喜欢
      • 2014-06-25
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2011-10-20
      • 1970-01-01
      • 2019-11-27
      相关资源
      最近更新 更多