Jpa 实体更新为映射的@ElementCollection抛出NPE

Jpa 实体更新为映射的@ElementCollection抛出NPE,jpa,eclipselink,Jpa,Eclipselink,我有部门和员工实体。Employee表有三列: 部门ID 钥匙 价值观 在Employee表的非空键的插入中插入空值。在更新期间,我收到了NullPointerException,在prop.put(key,value)期间,现有密钥的值为非空: 位于的java.lang.NullPointerException java.util.Hashtable.put(Hashtable.java:514)位于 org.eclipse.persistence.indirection.IndirectMa

我有部门和员工实体。Employee表有三列:

  • 部门ID
  • 钥匙
  • 价值观
  • 在Employee表的非空键的插入中插入空值。在更新期间,我收到了
    NullPointerException
    ,在
    prop.put(key,value)
    期间,现有密钥的值为非空:

    位于的java.lang.NullPointerException java.util.Hashtable.put(Hashtable.java:514)位于 org.eclipse.persistence.indirection.IndirectMap.put(IndirectMap.java:543) 在 org.eclipse.persistence.internal.querys.MapContainerPolicy.addInto(MapContainerPolicy.java:131) 在 org.eclipse.persistence.internal.querys.MappedKeyMapContainerPolicy.addInto(MappedKeyMapContainerPolicy.java:196) 在 org.eclipse.persistence.querys.DataReadQuery.executeNonCursor(DataReadQuery.java:226) 在 org.eclipse.persistence.querys.DataReadQuery.executeDatabaseQuery(DataReadQuery.java:152) 在 org.eclipse.persistence.querys.DatabaseQuery.execute(DatabaseQuery.java:899) 在 org.eclipse.persistence.querys.DataReadQuery.execute(DataReadQuery.java:137) 在 org.eclipse.persistence.querys.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:798) 在 org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) 在 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) 在 org.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.InstanceEIMPL(UnitOfWorkValueHolder.java:173) 在 org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.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

    我有部门和员工实体,部门实体类与员工实体的关系如下:

    @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;
       }
    
    @实体
    @表(name=“DEPARTMENT”唯一约束={
    @UniqueConstraint(columnNames={“NAME”})})
    @命名查询({
    @NamedQuery(name=Department.findAll),query=“从部门d中选择d”),
    @NamedQuery(name=Department.findByName),query=“从Department d中选择d,其中d.name=:name”)}
    公共类部门实现可序列化{
    @元素集合
    @MapKeyColumn(name=“KEY”)
    @列(name=“VALUE”)
    @CollectionTable(name=“DEPARTMENT\u PROP”,joinColumns=@joinColumn(name=“DEPARTMENT\u ID))
    private final Map props=new HashMap();
    公共映射getProperties(){
    归还财产;
    }
    
    实体类的任何方法或持久实例变量都不能被删除
    final
    。从
    props
    中删除此修饰符,映射注释看起来很好


    请注意,在java版本7中,您不能输入空值,因为
    java.util.Hashtable
    不允许使用空值,并且正如您在异常日志中所看到的,EclipseLink使用的是map的实现。请参阅。

    我删除了final,但仍然存在相同的问题。您使用的是哪个java版本?建议您更新关于HashM的答案ap…您指的是Hashtable(HashMap允许空值)。跟踪中的Hashtable来自哪里…可能是EclipseLink内部变量。如果持久化字段,方法也可以是最终的