Hibernateのクラスを使用せずにJPAでマップをマップするにはどうすればよいですか?JPA Map <String、String>マッピング
答えて
次の機能はありませんか?
@ManyToMany(cascade = CascadeType.ALL)
Map<String,EntityType> entitytMap = new HashMap<String, EntityType>();
EntityType
はString
を含む、任意のエンティティタイプとすることができます。
は、私は章の地図を持っているブックの名前付きエンティティがあるとします。
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;
}
}
それは私のために動作します。
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
を使用することができます。それは自動的に行われます。
作業例:
@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 ")'が必要です。 – Blauhirn
私のコードはMapエンティティ内の
私は少し混乱しています。問題は、Mapのマッピングについてでしたが、「最良の答え」はMap に関するものです。何かお見逃しですか? –
whiskeysierra
EntityTypeには、Stringを含む任意のエンティティタイプを使用できます。 –
これはいくつのテーブルを生成しますか? (元のクラスとエンティティタイプのキーを持つ)結合テーブルと、(3)EntityTypeの別のテーブル(与えられたシナリオでは、結合だけのテーブルテーブルキーとマップされた文字列)? これは、保存された文字列に応じてオーバーヘッドが大きくなる可能性があります。 – RobertG