java.util.Listをいかにマップするか

java.util.List をマッピングする場合、@OneToMany や @ManyToMany を使います。しかし、これだけでは要素の順序が不定になってしまいます。

また、一対多・多対多の、「多」に属するテーブルは、順序やインデックスを表す整数値のカラムを含むこともよくあります。

たとえば、テーブル entry から item へ一対多の関連があり、entry内でitemが順序をもつ場合、インデックスを表す カラム ord を以下のように加えます:

CREATE TABLE entry (
  entryid SERIAL PRIMARY KEY,
  entryname TEXT,
  ...
);

CREATE TABLE item (
  entryid SERIAL,
  itemid SERIAL PRIMARY KEY,
  ord INTEGER,
  itemname TEXT,
  ..
);

INSERT INTO entry VALUES (1, 'an entry', ...);
INSERT INTO item VALUES (1, 1, 3, 'third item', ...);
INSERT INTO item VALUES (1, 2, 1, 'first item', ...);
INSERT INTO item VALUES (1, 3, 2, 'second item', ...);

このような関連と順序をjava.util.Listに対応づける場合、アノテーション @org.hibernate.annotations.IndexColumn を使うそうです。

2.4.6.2. Extra collection types - 2.4.6.2.1. List


(動作未確認)

@Entity
public class Entry {
  @OneToMany
  @IndexColumn(name="ord", base=1)
  public List<Item> getItems() { /*ゲッター*/ }
  public void setItems(List<Item> items) { /*セッター*/ }

  @Id
  public int getEntryId() {...}
  public void setEntryId(int id) {...}

  public String getEntryname() {...}
  public void setEntryname(String name) {...}

}

@Entity
public class Item {
  @Id
  public int getItemid() {...}
  public void setItemid(int id) {...}
  
  public String getItemname() {...}
  public void setItemname(String name) {...}
}