2015-07-10 42 views
0

我有这样的实体NPE上多对多在DataNucleus将

@Entity 
public class ContactList extends Base { 

    private static final long serialVersionUID = BaseEntity.serialVersionUID; 

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Collection<User> contacts = new HashSet<User>(); 

    public ContactList() { 
    } 

    public Collection<User> getContacts() { 
     return contacts; 
    } 

    public void setContacts(Collection<User> contacts) { 
     this.contacts = contacts; 
    } 

} 

和任何方法我从Spring数据仓库打电话,像findAll(),我得到这个错误

java.lang.NullPointerException: null 
at org.datanucleus.store.rdbms.RDBMSStoreManager.assertCompatibleFieldType(RDBMSStoreManager.java:1005) ~[datanucleus-rdbms-4.1.1.jar:na] 
at org.datanucleus.store.rdbms.RDBMSStoreManager.getBackingStoreForField(RDBMSStoreManager.java:965) ~[datanucleus-rdbms-4.1.1.jar:na] 
at org.datanucleus.store.rdbms.query.BulkFetchExistsHelper.getSQLStatementForContainerField(BulkFetchExistsHelper.java:93) ~[datanucleus-rdbms-4.1.1.jar:na] 
at org.datanucleus.store.rdbms.query.JPQLQuery.compileQueryFull(JPQLQuery.java:894) ~[datanucleus-rdbms-4.1.1.jar:na] 
at org.datanucleus.store.rdbms.query.JPQLQuery.compileInternal(JPQLQuery.java:296) ~[datanucleus-rdbms-4.1.1.jar:na] 
at org.datanucleus.store.query.Query.executeQuery(Query.java:1801) ~[datanucleus-core-4.1.1.jar:na] 
at org.datanucleus.store.query.Query.executeWithMap(Query.java:1747) ~[datanucleus-core-4.1.1.jar:na] 
at org.datanucleus.api.jpa.JPAQuery.getResultList(JPAQuery.java:197) ~[datanucleus-api-jpa-4.1.1.jar:na] 
at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:77) ~[spring-data-jpa-1.3.0.RELEASE.jar:na] 
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:55) ~[spring-data-jpa-1.3.0.RELEASE.jar:na] 
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:95) ~[spring-data-jpa-1.3.0.RELEASE.jar:na] 
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:85) ~[spring-data-jpa-1.3.0.RELEASE.jar:na] 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:312) ~[spring-data-commons-1.5.0.RELEASE.jar:na] 

任何想法,为什么?

我也尝试加入targetEntity = User.class到@ManyToMany。 我正在使用DataNucleus 1.4.1。

我在日志中发现了以下行,可能是相关的:

DataNucleus.Datastore.Schema - DEBUG: Field [ContactList.contacts] -> Column(s) [contactlist.contacts] using mapping of type "org.datanucleus.store.rdbms.mapping.java.TypeConverterMapping" (org.datanucleus.store.rdbms.mapping.datastore.VarCharRDBMSMapping) 
... 
DataNucleus.Persistence - WARN : Member ContactList.contacts in table=contactlist has mappin[email protected]6296ccf7 but expected mapping type=class org.datanucleus.store.rdbms.mapping.java.CollectionMapping 
+0

这是因为从'org.datanucleus.store.rdbms.query.BulkFetchExistsHelper#getSQLStatementForContainerField():93'方法'storeMgr.getBackingStoreForField(clr,mmd,null);'(所以'type'是'null ')被调用,并且进一步沿着'type'的道路被访问而没有任何额外的检查。 –

+0

的确如此。但是如果抛出异常,我不认为NPE是期望的行为。 无论如何,我还在日志DataNucleus.Datastore.Schema - DEBUG:Field [ContactList.contacts] - >列[contactlist.contacts]中使用类型为“org.datanucleus.store.rdbms.mapping .java.TypeConverterMapping“(org.datanucleus.store.rdbms.mapping.datastore.VarCharRDBMSMapping)'。我编辑了这个问题来添加这个。 –

回答

0

的问题是,一个Converter被自动应用。但我认为这是DataNucleus将有一个问题,因为转换器是像这样声明

public class ListOfMyEnumsToStringAttributeConverter 
    extends CollectionOfEnumsToStringAttributeConverter<MyEnum, List<MyEnum>> 
    implements AttributeConverter<List<MyEnum>, String> 

DataNucleus将有另一个问题是,NPE被抛出,即使警告/错误应记录消息。

最后但并非最不重要的是,当自动应用转换器并导致错误时,转换器类应该成为日志消息的一部分。

+0

如果这不应该起作用,那么应该抛出一个带有明确信息的异常。但是你可以用'@ Basic'注解一个'Collection',所以...... –