4

私はさまざまなことを試しました。たとえば、最も単純なものです。

// Value object
@Embeddable
@NoSql(dataFormat=DataFormatType.MAPPED)
public class Attribute implements Serializable {

   @Basic
   private String someProp;

   // ... getter/setter omitted
}

@Entity
@NoSql(dataFormat=DataFormatType.MAPPED)
public class FancyEntity implements Serializable {

   @Id
   @GeneratedValue
   @Field(name="_id")
   private String id;

   @ElementCollection
   private Map<String,Attribute> attributes = new HashMap<>();

   // ... getter/setter omitted
}

しかし、これはエラーを生成します:

Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.4.1.v20120825fb0a20b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [myPersistenceUnit] failed.
Internal Exception: java.lang.ClassCastException: org.eclipse.persistence.eis.mappings.EISCompositeCollectionMapping cannot be cast to org.eclipse.persistence.mappings.foundation.MapComponentMapping
at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:221)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFailedPersistenceException(EntityManagerSetupImpl.java:1541)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1532)
at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:208)

何か案が?

Glassfish3.1.2で最新の2.4.1-SNAPSHOTを使用しています。

解決

@MapKeyアノテーションを追加し、埋め込み可能なクラス内で目的のキーフィールドを選択します。

   @ElementCollection
   @MapKey(name="name")
   private Map<String,Attribute> attributes = new HashMap<>();
4

1 に答える 1

2

@MapKeyを使用して、Attributeオブジェクトからマップキーを定義できるはずです(私はその名前を想定しています)。

@ MapKeyColumn、@ MapKeyJoinColumn、および@MapKeyClassは、EclipseLinkの現在のNoSQLサポートではサポートされていません。

ただし、例外に関するバグをログに記録してください。エラーが改善されるか、マップキーのデフォルトが改善されるはずです。

于 2012-09-04T13:48:49.757 に答える