2009-05-12 14 views

答えて

16

次の機能はありませんか?

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

Stringを含む、任意のエンティティタイプとすることができます。

+12

私は少し混乱しています。問題は、Map のマッピングについてでしたが、「最良の答え」はMap に関するものです。何かお見逃しですか? – whiskeysierra

+9

EntityTypeには、Stringを含む任意のエンティティタイプを使用できます。 –

+2

これはいくつのテーブルを生成しますか? (元のクラスとエンティティタイプのキーを持つ)結合テーブルと、(3)EntityTypeの別のテーブル(与えられたシナリオでは、結合だけのテーブルテーブルキーとマップされた文字列)? これは、保存された文字列に応じてオーバーヘッドが大きくなる可能性があります。 – RobertG

10

は、私は章の地図を持っているブックの名前付きエンティティがあるとします。

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

} 

それは私のために動作します。

+0

+1ではありません。そして、もし私がこれらの本のすべての章3を取りたいのであれば?私は同様の質問を持っています:http://stackoverflow.com/questions/12952625/jpa-category-language-relationship – ianaz

+1

@ianaz 'Book bからのcの選択b.chapters c where key(c)= '3' ' –

+3

残念ながら、これには休止状態に特有の注釈が必要です。問題は解決策がないことでした。 – RobertG

14

Subhendu Mahantaからの回答は正しいが、しかし、@CollectionOfElementsは推奨されていません。

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

Mapフィールドに別々のエンティティクラスを作成する必要はありません:あなたは代わりに@ElementCollectionを使用することができます。それは自動的に行われます。

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エンティティ内の