1

エンティティのコレクション (マップ) を継承でマップしたいと考えています。エンティティと継承エンティティは次のようになります。

@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 戦略を使用する機会はありますか? 「複数の書き込み可能なマッピング」はどこに記載されていますか?

4

0 に答える 0