java.lang.NullPointerException at org.hibernate.type.LongType.next(LongType.java
1、為了初步解決並發造成的問題,我們通常會在實體類上聲明一個版本管理字段,並且引入的@version註解,這就就簡單實現了樂觀鎖功能;
Java代碼
- @Version
- private Long version;
2、在操作表單提交時,hibernate會根據操作類型進行(如果是新增,默認會生成一個版本為0的版本號,
後面每次修改都會在現有版本後的基礎上加1)對版本號進行維護。
應用場景:
如果兩個人(甲,乙)同時對同實體進行修改,甲先提交,乙後提交,那麽乙提交是會報錯的。(因為甲已修改,乙提交的版本號比數據庫中的版本號低,因此不能進行更新)。
註意事項:
運用版本控制字段需要註意,在修改時要將版本號一起提交,否則hibernate因為維護版本號時因無法參考當前版本而拋出空指針異常。
hibernate異常拋出位置:
Java代碼
- org.hibernate.type.LongType
- @SuppressWarnings({ "UnnecessaryBoxing", "UnnecessaryUnboxing" })
- public Long next(Long current, SessionImplementor session) {
- return Long.valueOf( current.longValue() + 1 );
- }
異常信息:
嚴重: 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