• 検索結果がありません。

6 S ti コレクションとマップを使う

6.2 フィールド変数にMapを使う

 フィールド変数が

Map

の場合も、

@ElementCollection

を付加するだけです。マップ 型の変数もリストと同様に、別のデータベーステーブルに移されます。

 なお、テーブル名を指定したい時は、

@CollectionTable

で名前を指定します。指定 しない場合、元クラスの名前とマップ変数名をアンダーバーでつないだ名前のテーブルが 作成されます。また、

@MapKeyColumn

を使ってマップのキーを持つカラムの名前を指定 し、

@Column

を使ってマップの値を持つカラムの名前を指定できます。

マップを属性に持つエンティティ sample23-09/beans/Employee8 例題9

@Entity

public class Employee8 implements Serializable { @Id

private Long id;

private String name;

@ElementCollection // Map型の変数であることを知らせる

@CollectionTable(name="items") // Mapのテーブル名をITEMSとする

@MapKeyColumn(name="drink") // Mapのキーカラム名をDRINKとする

@Column(name="num") // Mapの値カラム名をNUMBERとする

private Map<String, Integer> items;

// コンストラクタ、セッターとゲッター(省略)

}

 このエンティティからもテーブルは、本体(EMPLOYEE8)とマップ(ITEMS)の2つがで きます。ITEMSテーブルには、マップである

items

のすべての要素が含まれます。

 

 例題では、バッキングビーンで次のようにしてエンティティを作成し、データベースに 登録しています。

16

例題9(続き):Map型の要素を持つエンティティの作成 sample23-09/beans/Bb.java 1 @Named

2 @RequestScoped

3 public class Bb {

4 @EJB

5 Employee8Db db;

6 public List<Employee8> getAll() {

7 return db.getAll();

8 }

9 @PostConstruct

10 private void init() {

11 if(db.isEmpty()){

12 Map<String, Integer> map1 = new LinkedHashMap();

13 map.put("ビール", 10);

14 map.put("ウィスキー", 11);

15

16 db.create(new Employee8(1L, "田中宏", map));

17 db.create(new Employee8(2L, "中村太郎", map));

18 }

19 }

20 }

 2つのエンティティが同じ

Map

を持つようにしてい ます。

Map

の場合、

List

と違って何かの選択肢など に使われます。そこでこれを

h:dataTable

の中のラ ジオボタンとして表示したのが、次の

index.xhtml

です。

例題9(続き):Map型のフィールドの表示 sample23-09/index.xhtml 1 <h:body>

2 <h3>Map型のフィールド変数</h3>

3 <h:form>

4 <h:dataTable value="#{bb.all}" var="item">

5 <h:column>#{item.id}</h:column>

6 <h:column>#{item.name}</h:column>

7 <h:column>

8 <h:selectOneRadio value=""> // Mapの要素を表示する 9 <f:selectItems value="#{item.items}"/>

10 </h:selectOneRadio>

11 </h:column>

12 </h:dataTable>

13 </h:form>

14 </h:body>

16

 3つの列からなる

h:dateTable

にエンティティを表示しますが、3列目は

Map

なので、

h:selectOneRadio

の選択肢にしています。表示するとラジオボタンが2つ出て選択でき るようになります。ただ、選択結果を入れる変数などはエンティティにないのでここでは 空欄にしています(8行)。

16

 システム設計の最初の段階で、どのようなエンティティを使うのか決める時に、この章で解説 したマッピングの知識が必要になります。主キーの自動生成や複合キーはよく使うものの代表で す。また、データベースにファイルなどを格納することもしばしばあるので、使い方を知っておか ねばなりません。画像表示の方法はやや難しいのですが、実用上知っていないと困る知識の1つで す。

関連したドキュメント