我正在尝试通过作为集合存在的实体更新数据透视表,我的数据透视表有一个版本字段,当它更新时会抛出 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;