エンティティのコレクション (マップ) を継承でマップしたいと考えています。エンティティと継承エンティティは次のようになります。
@Entity
public class TestEntity {
@OneToMany(mappedBy = "parent")
public Map<String, MapValueEntity> map
= new HashMap<String, MapValueEntity>();
@Id
@GeneratedValue(strategy = AUTO)
protected long id;
public String name;
public TestEntity() {
}
public TestEntity(String name) {
this.name = name;
}
}
@Entity
public class SubEntity extends TestEntity{
public SubEntity() {
}
String testSubEntityName;
public SubEntity(String name) {
this.testSubEntityName = name;
}
}
マップ値として使用されるエンティティはこれです
@Entity
public class MapValueEntity {
TestEntity parent;
@Id
@GeneratedValue(strategy = AUTO)
protected long id;
public MapValueEntity() {
}
String subEntityName;
public MapValueEntity(String name) {
this.subEntityName = name;
}
}
そして、ここにテストコードがあります:
EntityManager em = EntityManagerService.getEntityManager();
em.getTransaction().begin();
for (int i = 0; i < 10; i++) {
TestEntity e = new TestEntity("MyNameIs" + i);
for (int j = 0; j < 8; j++) {
MapValueEntity se = new MapValueEntity("IamNo" + j + "." + i);
e.map.put("Key" + i * 100 + j, se);
se.parent = e;
em.persist(se);
}
em.persist(e);
}
em.getTransaction().commit();
これまでのところ、すべて正常に動作しています。EclipseLink は、TestEntity と SubEntity を、クラスを区別するための識別子列を持つ 1 つのテーブルに配置します。また、完全なマップ データは MapValueEntity のテーブルに格納されます。ここで、マッピング戦略をデフォルト (= SINGLE_TABLE) から TABLE_PER_CLASS に変更すると、構造が壊れます:
@Entity
@Inheritance(strategy = TABLE_PER_CLASS)
public class TestEntity {
...
例外の説明には次のように書かれています。
フィールド [MAPVALUEENTITY.MAP_KEY] には複数の書き込み可能なマッピングが存在します。書き込み可能として定義できるのは 1 つだけで、その他はすべて読み取り専用として指定する必要があります。
このシナリオで TABLE_PER_CLASS 戦略を使用する機会はありますか? 「複数の書き込み可能なマッピング」はどこに記載されていますか?