この埋め込みフィールドをエンティティに追加した後、例外が発生します。
@Entity
public class Team extends DataObject
{
@Embedded
private TeamEvolution teamEvolution = new TeamEvolution();
// NEW FIELD:
@Embedded
// @AttributeOverrides({ @AttributeOverride(name = "buffer", column = @Column) })
// @Enumerated
private ScoutBuffer scoutBuffer;
...
この男は非常に単純です。
@Embeddable
public class ScoutBuffer
{
private static final int BUFFER_SIZE = 150;
@Basic
private List<String> buffer;
... // from here on there are only methods...
変更をマージしようとすると、次の例外が発生します。
java.lang.IllegalArgumentException: out of field index :-1
at com.olympya.futweb.datamodel.model.ScoutBuffer.jdoProvideField(ScoutBuffer.java)
at org.datanucleus.state.JDOStateManagerImpl.provideField(JDOStateManagerImpl.java:2585)
at org.datanucleus.state.JDOStateManagerImpl.provideField(JDOStateManagerImpl.java:2555)
at org.datanucleus.store.mapped.mapping.CollectionMapping.postUpdate(CollectionMapping.java:185)
at org.datanucleus.store.mapped.mapping.EmbeddedPCMapping.postUpdate(EmbeddedPCMapping.java:133)
// etc, etc...
何もする必要はないと思いますが、JDOHelper.makeDirty
変更したことを認識するためにエンティティをマージする前に使用する必要がありましたscoutBuffer
:
team.getScoutBuffer().add(playerIds);
JDOHelper.makeDirty(team, "scoutBuffer");
em.merge(team);
コードでコメントされていることがわかるように、ここで説明されている回避策を試しましたが、成功しませんでした。奇妙なことに、それは 2009 年のものです...ちなみに、私は GAE 1.7.0 を使用しています。また、データモデルのクリーニング/再強化を試みました。