尝试更新包含具有版本字段的数据透视表的实体的空指针异常



我正在尝试通过作为集合存在的实体更新数据透视表,我的数据透视表有一个版本字段,当它更新时会抛出 NullPointerException

我正在使用Java 8和Hibernate作为JPA提供程序

主体 "地毯.java">

@JoinColumn(name = "car_subcarpeta_id", referencedColumnName = "sub_id")
@OneToOne(cascade = CascadeType.ALL)
@Fetch(FetchMode.JOIN)
private RjFicha fichaId;

"Carpeta.java"的外键 "亚地毯.java">

@OneToMany(mappedBy = "subCarpeta", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@Fetch(FetchMode.SUBSELECT)
private Collection<item> itemCollection;

数据透视表与SubCarpeta相关 "项目.java">

@JoinColumn(name = "i_subcarpeta_id", referencedColumnName = "sub_id")
@ManyToOne
private SubCarpeta subCarpeta;
@Column(name = "i_version")
@Version
private Integer version;

这是描述 NullPointerException 源时的跟踪部分

Caused by: java.lang.NullPointerException
at org.hibernate.type.IntegerType.next(IntegerType.java:63)
at org.hibernate.type.IntegerType.next(IntegerType.java:22)
at org.hibernate.engine.internal.Versioning.increment(Versioning.java:92)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.getNextVersion(DefaultFlushEntityEventListener.java:383)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:279)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:143)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:216)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:85)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:38)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1300)
at org.jboss.as.jpa.container.AbstractEntityManager.flush(AbstractEntityManager.java:459)
... 141 more

尝试使用原始int而不是 Wrapper 类。

@Column(name = "i_version")
@Version
private int version;

整数的默认值为 null,int 为 0。

根据 IntegerType API Java Doc ,

@Override
public Integer next(Integer current, SharedSessionContractImplementor session) {
return current + 1;
}

如果保留整数类 null+1 则抛出空指针异常

解决方案是将数据库中的表字段设置为 NOT NULL 和 DEFAULT 0。

ALTER TABLE table_name CHANGE COLUMN i_version i_version INT(11) NOT NULL DEFAULT 0;

这是因为如果字段为 NULL,则合并的结果实体会将版本字段获取为 NULL,并在稍后抛出 NullPointerException。

这是用于更新实体的代码:

T toReturn = (T)this.em.merge(entity);
this.em.flush();
this.em.refresh(toReturn);
return toReturn;

最新更新