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つで す。