2015-08-30 17 views
0

我有Department和Employee實體。 Employee表中有三列:實體更新拋出映射的@ElementClection的NPE

  1. DEPARTMENT_ID
  2. KEY
  3. VALUE

在我插在Employee表的非空鍵插入空值。我在我的prop.put(key, value)與現有主要非空值更新時得到NullPointerException

顯示java.lang.NullPointerException在 java.util.Hashtable.put(Hashtable.java:514)在 org.eclipse.persistence .indirection.IndirectMap.put(IndirectMap.java:543) 在 org.eclipse.persistence.internal.queries.MapContainerPolicy.addInto(MapContainerPolicy.java:131) 在 org.eclipse.persistence.internal.queries.MappedKeyMapContainerPolicy .addInto(MappedKeyMapContainerPolicy.java:196) at org.eclipse.persistence.queries.DataReadQuery.executeNon光標(DataReadQuery.java:226) 在 org.eclipse.persistence.queries.DataReadQuery.executeDatabaseQuery(DataReadQuery.java:152) 在 org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899) 在 org.eclipse.persistence.queries.DataReadQuery.execute(DataReadQuery.java:137) 在 org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:798) 在 org.eclipse.persistence .internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804) org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1786) 在 org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:129) 在 有機.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:116) 在 org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:89) 在 org.eclipse.persistence .internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:173) at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWor kValueHolder.java:234) 在 org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:89) 在 org.eclipse.persistence.indirection.IndirectMap.buildDelegate(IndirectMap.java:109) 在 org.eclipse.persistence.indirection.IndirectMap.getDelegate(IndirectMap.java:329) 在 org.eclipse.persistence.indirection.IndirectMap.put(IndirectMap.java:543)

的EclipseLink版本是2.5。2

我有Department和Employee實體和Department實體類與僱員實體以下關係:

@Entity 
@Table(name = "DEPARTMENT" uniqueConstraints = { 
    @UniqueConstraint(columnNames = { "NAME" }) }) 
@NamedQueries({ 
    @NamedQuery(name = Department.findAll", query = "select d from Department d"), 
@NamedQuery(name = Department.findByName", query = "select d from Department d WHERE d.name = :name")}) 

public class Department implements Serializable { 

    @ElementCollection 
    @MapKeyColumn(name = "KEY") 
    @Column(name = "VALUE") 
    @CollectionTable(name="DEPARTMENT_PROP", joinColumns =  @joinColumn(name= "DEPARTMENT_ID)) 
    private final Map<String, String> props = new HashMap(); 


    public Map<String, String> getProperties() { 
     return properties; 
    } 

回答

0

實體類的任何方法或持久實例變量可能是 final。從props中刪除此修改器,映射註釋看起來很好。

請注意,在java版本7中,您不能放置空值,因爲java.util.Hashtable不允許它,正如您在異常日誌中看到的那樣,它是EclipseLink使用的映射的實現。請參閱this java oficial doc

+0

我刪除了最終並仍然得到相同的問題。 – spider

+0

您正在使用哪個java版本? – Guillermo

+1

建議您更新有關HashMap的答案......您指的是Hashtable(HashMap允許爲空值)。跟蹤中的Hashtable來自...也許是EclipseLink內部變量。如果持續字段,方法也可以是最終的 –