1. 程式人生 > >java.lang.NullPointerException at org.hibernate.type.LongType.next(LongType.java

java.lang.NullPointerException at org.hibernate.type.LongType.next(LongType.java

exceptio 當前 image tro imp type 空指針異常 個人 分享圖片

1、為了初步解決並發造成的問題,我們通常會在實體類上聲明一個版本管理字段,並且引入的@version註解,這就就簡單實現了樂觀鎖功能;

Java代碼 技術分享圖片
  1. @Version
  2. private Long version;

2、在操作表單提交時,hibernate會根據操作類型進行(如果是新增,默認會生成一個版本為0的版本號,

後面每次修改都會在現有版本後的基礎上加1)對版本號進行維護。

應用場景:

如果兩個人(甲,乙)同時對同實體進行修改,甲先提交,乙後提交,那麽乙提交是會報錯的。(因為甲已修改,乙提交的版本號比數據庫中的版本號低,因此不能進行更新)。

註意事項:

運用版本控制字段需要註意,在修改時要將版本號一起提交,否則hibernate因為維護版本號時因無法參考當前版本而拋出空指針異常。

hibernate異常拋出位置:

Java代碼 技術分享圖片
  1. org.hibernate.type.LongType
  2. @SuppressWarnings({ "UnnecessaryBoxing", "UnnecessaryUnboxing" })
  3. public Long next(Long current, SessionImplementor session) {
  4. return Long.valueOf( current.longValue() + 1 );
  5. }

異常信息:

嚴重: Servlet.service() for servlet springmvc threw exception

java.lang.NullPointerException

at org.hibernate.type.LongType.next(LongType.java:76)

at org.hibernate.type.LongType.next(LongType.java:40)

at org.hibernate.engine.Versioning.increment(Versioning.java:131)

at org.hibernate.event.def.DefaultFlushEntityEventListener.getNextVersion(DefaultFlushEntityEventListener.java:406)

at org.hibernate.event.def.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:296)

at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:155)

at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)

at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)

at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)

java.lang.NullPointerException at org.hibernate.type.LongType.next(LongType.java