Spring MVC + Hibernate +一对一映射:session.save时出现空指针异常(Spring MVC + Hibernate + one to one mapping : nul

编程入门 行业动态 更新时间:2024-10-28 21:15:53
Spring MVC + Hibernate +一对一映射:session.save时出现空指针异常(Spring MVC + Hibernate + one to one mapping : null pointer exception while session.save)

问题定义:

USER_TABLE和USER_DETAIL_TABLE是使用userid字段映射的OneToOne。 面对两个问题!

保存UserDetailTable时遇到nullpointer异常。

首先设置UserTable,然后保存USerDetailTable。

userid值生成为0,但我使用nullable = false。 - 有时我看到USER_TABLE的userid值为1,USER_DETAIL_TABLE的userid为0.特别是当我在创建表时已经为'admin'插入了一行时。

我想在创建数据库时插入默认的'admin'用户ID。

我正在使用以下网站提供的布局http://websystique.com/springmvc/spring-4-mvc-and-hibernate4-integration-example-using-annotations/

从上面的例子中使用AppInitializer,AppConfig和Hibernate配置。

我更新了AppConfig以包含tile和jsp页面,两个viewresolvers分别有一个和两个排序。

为了简短起见,给出代码片段

User.Class

@Entity @Table(name="USER_TABLE") public class User{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="userid", nullable=false) private int userid; ... ... }

UserDetail.Class

@Entity @Table(name="USER_DETAIL_TABLE") public class UserDetail { //@Id @Column(name="userid", nullable=false) @Id @GeneratedValue(generator = "genuserid") @GenericGenerator(name = "genuserid", strategy="foreign", parameters = @Parameter(value="USER_TABLE", name = "property") ) private int userid; private String firstname; private String lastname; //@PrimaryKeyJoinColumn @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name="userid") private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }

UserDetailDao类

@Repository("UserDetailDao") public class UserDetailDaoImpl extends AbstractDao implements UserDetailDao { @Override public void saveUserDetail( UserDetail userdetail, User user) { // some time userdetail.userid is 0!! // and user.userid is 1 !! // setting User table info userdetail.setUser(user); //persist(userdetail); //getSession().beginTransaction( getSession().save(userdetail); //getSession().getTransaction().commit(); }

UserDetailService类

@Service("userdetailService") @Transactional public class UserDetailServiceImpl implements UserDetailService{ @Autowired private UserDetailDao userDetailDao; @Override public void saveUserDetail(UserDetail userdetail,User user) { userDetailDao.saveUserDetail(userdetail, user); }

控制器类

@Controller public class WebMainController { @Autowired UserDetailService userDetailService; //For add and update person both @RequestMapping(value= "useradd", method = RequestMethod.POST) public String addPerson( @ModelAttribute("userdetail") UserDetail userdetail,BindingResult resultUser, @ModelAttribute("user") User user,BindingResult resultUserdetail ) { //UserDetail userdetail = new UserDetail(); //userdetail.setUser(user); userDetailService.saveUserDetail(userdetail, user); return "redirect:/useradd"; }

使用MySQL:SQL脚本

CREATE TABLE user_table ( userid INT(10) not null auto_increment, loginname VARCHAR(16) NOT NULL , password VARCHAR(32) NOT NULL , PRIMARY KEY (userid) )ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE user_detail_table( userid INT(10) not null, firstname VARCHAR(16) , PRIMARY KEY (userid), FOREIGN KEY (userid) REFERENCES user_table (userid) ON UPDATE CASCADE ON DELETE CASCADE )ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user_table(userid, loginname,password) VALUES (1,'admin','admin'); INSERT INTO user_detail_table(userid, firstname) VALUES (1,'Administrator');

还有一个问题

我可以在'user'和'user_detail'表中手动插入一行以获得'admin'字段吗? 注释@GeneratedValue检查数据库,然后递增(生成)用户标识的值,对不对?

异常错误如下

message Request processing failed; nested exception is java.lang.NullPointerException description The server encountered an internal error that prevented it from fulfilling this request. exception org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) javax.servlet.http.HttpServlet.service(HttpServlet.java:644) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) javax.servlet.http.HttpServlet.service(HttpServlet.java:725) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) root cause java.lang.NullPointerException org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValue(AbstractEntityTuplizer.java:650) org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:4736) org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:96) org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117) org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) com.cms.sweb.dao.UserDetailDaoImpl.saveUserDetail(UserDetailDaoImpl.java:49) com.cms.sweb.service.UserDetailServiceImpl.saveUserDetail(UserDetailServiceImpl.java:23) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) com.sun.proxy.$Proxy40.saveUserDetail(Unknown Source) com.cms.sweb.controller.WebMainController.addPerson(WebMainController.java:87) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) javax.servlet.http.HttpServlet.service(HttpServlet.java:644) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) javax.servlet.http.HttpServlet.service(HttpServlet.java:725) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) note The full stack trace of the root cause is available in the Apache Tomcat/8.0.20 logs.

如果我错过了什么,请告诉我,我会添加它。 提前致谢!

Problem Definition:

USER_TABLE and USER_DETAIL_TABLE are OneToOne mapped with userid field. Facing two problems!

encounter nullpointer exception while saving UserDetailTable.

first setting UserTable and then saving USerDetailTable.

userid value is generated as 0, though i use nullable=false. -Also sometime i see userid value for USER_TABLE is 1 and userid for USER_DETAIL_TABLE is 0. specially when i have already inserted one row for 'admin' while creating the tables.

I want to have default 'admin' userid to be inserted while creating the database.

I am using the layout given by following site http://websystique.com/springmvc/spring-4-mvc-and-hibernate4-integration-example-using-annotations/

Using AppInitializer, AppConfig and Hibernate configuration from above example.

I update AppConfig to include tiles, and jsp pages, with two viewresolvers with one and two ordering respectively.

To keep things short, giving code snippets

User.Class

@Entity @Table(name="USER_TABLE") public class User{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="userid", nullable=false) private int userid; ... ... }

UserDetail.Class

@Entity @Table(name="USER_DETAIL_TABLE") public class UserDetail { //@Id @Column(name="userid", nullable=false) @Id @GeneratedValue(generator = "genuserid") @GenericGenerator(name = "genuserid", strategy="foreign", parameters = @Parameter(value="USER_TABLE", name = "property") ) private int userid; private String firstname; private String lastname; //@PrimaryKeyJoinColumn @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name="userid") private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }

UserDetailDao Class

@Repository("UserDetailDao") public class UserDetailDaoImpl extends AbstractDao implements UserDetailDao { @Override public void saveUserDetail( UserDetail userdetail, User user) { // some time userdetail.userid is 0!! // and user.userid is 1 !! // setting User table info userdetail.setUser(user); //persist(userdetail); //getSession().beginTransaction( getSession().save(userdetail); //getSession().getTransaction().commit(); }

UserDetailService Class

@Service("userdetailService") @Transactional public class UserDetailServiceImpl implements UserDetailService{ @Autowired private UserDetailDao userDetailDao; @Override public void saveUserDetail(UserDetail userdetail,User user) { userDetailDao.saveUserDetail(userdetail, user); }

Controller Class

@Controller public class WebMainController { @Autowired UserDetailService userDetailService; //For add and update person both @RequestMapping(value= "useradd", method = RequestMethod.POST) public String addPerson( @ModelAttribute("userdetail") UserDetail userdetail,BindingResult resultUser, @ModelAttribute("user") User user,BindingResult resultUserdetail ) { //UserDetail userdetail = new UserDetail(); //userdetail.setUser(user); userDetailService.saveUserDetail(userdetail, user); return "redirect:/useradd"; }

Using MySQL: SQL script

CREATE TABLE user_table ( userid INT(10) not null auto_increment, loginname VARCHAR(16) NOT NULL , password VARCHAR(32) NOT NULL , PRIMARY KEY (userid) )ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE user_detail_table( userid INT(10) not null, firstname VARCHAR(16) , PRIMARY KEY (userid), FOREIGN KEY (userid) REFERENCES user_table (userid) ON UPDATE CASCADE ON DELETE CASCADE )ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user_table(userid, loginname,password) VALUES (1,'admin','admin'); INSERT INTO user_detail_table(userid, firstname) VALUES (1,'Administrator');

one more Question

Can i manually insert a row in 'user' and 'user_detail' table to have 'admin' field? The annotation @GeneratedValue check the Database and then increment (generate) a value for the userid, am i right?

exception error is as follows

message Request processing failed; nested exception is java.lang.NullPointerException description The server encountered an internal error that prevented it from fulfilling this request. exception org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) javax.servlet.http.HttpServlet.service(HttpServlet.java:644) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) javax.servlet.http.HttpServlet.service(HttpServlet.java:725) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) root cause java.lang.NullPointerException org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValue(AbstractEntityTuplizer.java:650) org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:4736) org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:96) org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117) org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) com.cms.sweb.dao.UserDetailDaoImpl.saveUserDetail(UserDetailDaoImpl.java:49) com.cms.sweb.service.UserDetailServiceImpl.saveUserDetail(UserDetailServiceImpl.java:23) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) com.sun.proxy.$Proxy40.saveUserDetail(Unknown Source) com.cms.sweb.controller.WebMainController.addPerson(WebMainController.java:87) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) javax.servlet.http.HttpServlet.service(HttpServlet.java:644) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) javax.servlet.http.HttpServlet.service(HttpServlet.java:725) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) note The full stack trace of the root cause is available in the Apache Tomcat/8.0.20 logs.

If i miss anything, let me know i will add it. thanks in advance!

最满意答案

我认为在表上添加了行的Ids的问题,所以也许你应该首先在User_Table表中添加行并获取它的Id,然后在tabel User_Detail_Table添加新行,其中添加了新行的Id第一个表,我有同样的问题,我正在考虑解决方案,尝试并告诉我它是否正常工作

the error is in GenericGenerator Annotation.

@GenericGenerator(name = "genuserid", strategy="foreign", parameters = @Parameter(value="USER_TABLE", name = "property") )

the correct one is as below

@GenericGenerator(name = "genuserid", strategy="foreign", parameters = @Parameter(value="user", name = "property") )

The 'value' should be object where the foreign key is mapped to.

更多推荐

userid,java,org,springframework,public,电脑培训,计算机培训,IT培训"/> <meta n

本文发布于:2023-07-28 12:07:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1305172.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:指针   异常   session   Hibernate   Spring

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!