2009-05-12 32 views

Trả lời

16

Không có tác phẩm nào sau đây cho bạn?

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

EntityType có thể là bất kỳ loại thực thể, trong đó có một String.

+12

Tôi là một chút bối rối. Câu hỏi đặt ra là ánh xạ một Map , nhưng "câu trả lời hay nhất" là về một Map . Tôi có nhớ gì không – whiskeysierra

+9

EntityType có thể là bất kỳ loại thực thể nào, bao gồm một Chuỗi. –

+2

Có bao nhiêu bảng này tạo ra? Có (1) một cho lớp gốc, (2) một bảng nối (với các khóa cho lớp gốc và loại thực thể) và (3) một bảng khác cho EntityType (trong kịch bản đã cho), một bảng chỉ với tham gia khóa bảng và chuỗi được ánh xạ)? Điều này có thể là rất nhiều chi phí, tùy thuộc vào các chuỗi được lưu ... – RobertG

10

Giả sử tôi có một tổ chức có tên là Book mà là có một bản đồ của chương:

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; 
}    

} 

Nó làm việc cho tôi.

+0

+1. Và nếu tôi muốn chỉ lấy lại chương 3 của tất cả những cuốn sách này? Tôi có một câu hỏi tương tự: http://stackoverflow.com/questions/12952625/jpa-category-language-relationship – ianaz

+1

@ianaz 'select c từ Book b join b.chapters c trong đó khóa (c) = '3'' –

+3

Thật không may, điều này đòi hỏi chú thích đặc biệt ngủ đông. Câu hỏi là một giải pháp không có. – RobertG

14

Mặc dù câu trả lời được đưa ra bởi Subhendu Mahanta là chính xác. Nhưng @CollectionOfElements không còn được dùng nữa. Bạn có thể sử dụng thay vì @ElementCollection:

@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>(); 

Không cần để tạo ra một lớp Entity riêng cho lĩnh vực Map. Nó sẽ được thực hiện tự động.

1

Một ví dụ làm việc:

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

cho mối quan hệ nhiều-nhiều, bạn cũng cần 'joinColumns = @JoinColumn (name =" referencing_column ")' trong @CollectionTable và '@MapKeyJoinColumn (name =" referencing_column_other_table ")' – Blauhirn

+0

Mã của tôi là dành cho Bản đồ trong thực thể –

Các vấn đề liên quan