2009-05-12 8 views

답변

16

다음은 작동하지 않습니까?

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

EntityTypeString을 포함한 모든 개체 유형이 될 수 있습니다. 그것은 나를 위해 작동

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", 
     [email protected](name="BOOK_ID")) 
@MapKey ([email protected](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; 
}    

} 

: 가정하자

+12

나는 조금 혼란 스러워요. 질문은 Map 을 매핑하는 것이었지만 "최상의 답"은 Map 에 관한 것입니다. 내가 놓친 게 있니? – whiskeysierra

+9

EntityType은 String을 포함하여 모든 엔터티 형식이 될 수 있습니다. –

+2

이것은 얼마나 많은 테이블을 생성합니까? (원래 클래스와 엔티티 타입을위한 키를 가진) 조인 테이블과 EntityType을위한 또 다른 테이블이있다. (주어진 시나리오에서 조인 만있는 테이블 테이블 키 및 매핑 된 문자열)? 저장되는 문자열에 따라 많은 오버 헤드가 발생할 수 있습니다. – RobertG

10

나는 장의지도를 가지고있다 도서라는 개체가 있습니다.

+0

+1이 아닙니다. 그리고 만약 내가이 책들 전부 3 장만을 검색하고 싶다면? 나는 비슷한 질문을 가지고있다 : http://stackoverflow.com/questions/12952625/jpa-category-language-relationship – ianaz

+1

@ianaz'책 b에서 c 선택 b.chapters c where key (c) = '3 '' –

+3

불행하게도 이것은 최대 절전 모드에 특정한 주석을 필요로한다. 문제는없는 해결책이었습니다. – RobertG

14

Subhendu Mahanta가 준 답변이 맞지만. 그러나 @CollectionOfElements은 더 이상 사용되지 않습니다. 대신 @ElementCollection을 사용할 수 있습니다 다음 Map 필드에 대해 별도의 엔티티 클래스를 생성 할 필요가 없습니다

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

. 자동으로 수행됩니다.

1

동작하는 예제 :

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

다 대다 관계의 경우 @CollectionTable 및 @MapKeyJoinColumn (name = "referencing_column_other_table")에서 'joinColumns = @JoinColumn (name = "referencing_column")'이 필요합니다. – Blauhirn

+0

내 코드는 Map 엔티티의