Hibernate中主外键的插入问题

问题描述

有两张表,一张userinfo表,一张good表。其中good表中Saler_id列与userinfo表中主键列User_id是主外键的关系。其中在Hibernate的映射文件中的代码如下<many-to-onename="userinfoBySalerId"class="org.epai.web.entity.Userinfo"fetch="select"><columnname="Saler_id"not-null="true"/></many-to-one>

但是我在向good表中插入数据的时候总是在Saler_id这列报错,我需要获得当前登录人的ID再插入到这列中,异常信息如下:org.hibernate.PropertyValueException:not-nullpropertyreferencesanullortransientvalue:org.epai.web.entity.Goods.userinfoBySalerIdatorg.hibernate.engine.Nullability.checkNullability(Nullability.java:72)atorg.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:265)atorg.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167)atorg.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)atorg.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)atorg.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)atorg.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)atorg.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)atorg.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)atorg.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)atorg.hibernate.impl.SessionImpl.save(SessionImpl.java:518)atorg.hibernate.impl.SessionImpl.save(SessionImpl.java:514)atorg.epai.web.dao.impl.BaseDAO.add(BaseDAO.java:19)atorg.epai.web.dao.impl.GoodsDAO.addgood(GoodsDAO.java:13)atorg.epai.web.service.GoodsService.addgood(GoodsService.java:12)atorg.epai.web.action.AddgoodsAction.execute(AddgoodsAction.java:66)atorg.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)atorg.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)atorg.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)atorg.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)atjavax.servlet.http.HttpServlet.service(HttpServlet.java:710)atjavax.servlet.http.HttpServlet.service(HttpServlet.java:803)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)atorg.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)atorg.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)atorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)atorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)atorg.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)atorg.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)atorg.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)atorg.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)atorg.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)atorg.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)atjava.lang.Thread.run(UnknownSource)因为在Hibernate生成的good表中声明的这列是JavacodeprivateUserinfouserinfoBySalerId;

这样的话,没办法把从session中获得的当前登录人的id插入到这列中请问各位这个问题怎么解决呢?

解决方案

解决方案二:
冲session中获取id,跟HIBERNATE配置没什么关系.你登陆成功后session.setAttribute("id",id);用的时候session.getAttribute("id");可以根据id获取Userinfo对象userInfo.然后把userInfo作为属性set到GOOD的Bean中,调用save(goodBean);就可以了.
解决方案三:
你的book关联到了不存在的userinfo,<columnname="Saler_id"not-null="true"/>去掉not-null属性吧如果不想去掉not-null属性的话,你在关联到Saler_id的时候出错了吧,这个貌似是逻辑上的错误噢
解决方案四:
引用1楼wangpeng88888888的回复:

冲session中获取id,跟HIBERNATE配置没什么关系.你登陆成功后session.setAttribute("id",id);用的时候session.getAttribute("id");可以根据id获取Userinfo对象userInfo.然后把userInfo作为属性set到GOOD的Bean中,调用save(goodBean);就可以了.

可是数据库中Saler_id列是long型的,把userinfo类型这样直接插入就会报错啊
解决方案五:
引用2楼wind1373290的回复:

你的book关联到了不存在的userinfo,<columnname="Saler_id"not-null="true"/>去掉not-null属性吧如果不想去掉not-null属性的话,你在关联到Saler_id的时候出错了吧,这个貌似是逻辑上的错误噢

那我应该怎么做呢?不去掉not-null的话我应该怎么改呢?
解决方案六:
h我也想知道问题`
解决方案七:
没得想的,在Action里把用户ID取出来,然后到数据库取UserInfo对象,然后放进去,最后保存,Hibernate就是这样的了.
解决方案八:
报错的原因是非空属性插入了一个空值。如果针对这个错误的话,将not-null="true"改为not-null="false".我看你的应用是一对多的关系。所以应当运用set和many-to-one双向关联。这样保存“一方”对象时,就会自动插入的,我也是刚学习hibernate,共同探讨

时间: 2024-09-13 22:35:22

Hibernate中主外键的插入问题的相关文章

powerdesigner-【新兵营】PowerDesigner中如何生成的Ldm只有主外键

问题描述 [新兵营]PowerDesigner中如何生成的Ldm只有主外键 大家好!我想请问下PowerDesigner中如何生成的Ldm只有主外键,例如这样的![图片说明](http://img.ask.csdn.net/upload/201602/17/1455699737_92325.jpg) 每张表都只显示外键跟主键,并且表明他们的关系, 谢谢大家!祝大家新年快乐! 解决方案 用的比较少:看看这个文章吧!http://blog.csdn.net/zhang6622056/article/

mysql中的外键使用详解

mysql中MyISAM和InnoDB存储引擎都支持外键(foreign key),但是MyISAM只能支持语法,却不能实际使用.下面通过例子记录下InnoDB中外键的使用方法: 创建主表: mysql> create table parent(id int not null,primary key(id)) engine=innodb; Query OK, 0 rows affected (0.04 sec) 创建从表: mysql> create table child(id int,pa

C# 数据库dataGridView刷新数据和主外键判断

本文主要讲诉在使用VS2012+SQL Server数据库做系统中,通常会遇到几个问题.使用dataGridView控件在修改.删除.插入数据后,怎样刷新数据显示操作后的结果.同时在对数据操作时通常会判断数据的主键是否存在或重复,判断外键是否重复,这几个问题我推荐使用函数的形式完成,同时推荐一个操作格式,下面将详细介绍. 一.dataGridView刷新数据 如下图所示,在数据库中删除一个数据或插入一个数据,我们都希望能够在左边的dataGridView控件中显示操作后的内容,而使用dataGr

mysql生成hibernate映射文件外键不能生成

问题描述 RT我在项目中用powerdesigner建的mysql数据库,主外键在数据库中也有,但是在生成hibernate映射文件时外键不能生成关系(一对多.多对多)什么原因啊 解决方案 解决方案二:那就手动加上呗..我一般都是用myEclipse的逆向工程生成hbm文件解决方案三:关键是我这是生成不了手工配置添麻烦了解决方案四:没道理呀,我配出来的都是有的.怪了...

ORACLE中关于外键缺少索引的探讨和总结

    在ORACLE数据库中,定义外键约束时,ORACLE是不会自动创建对应索引的,必须手动在外键约束相关的列上创建索引.那么外键字段上是否有必要创建索引呢?如果有必要的话,巡检时,如何找出外键字段上没有创建索引的相关表,并生成对应的索引的脚本呢?   外键缺失索引影响   外键列上缺少索引会带来三个问题,限制并发性.影响性能.还有可能造成死锁.所以对于绝大部分场景,我们应该尽量考虑在外键上面创建索引   1. 影响性能. 如果子表外键没有创建索引,那么当父表查询关联子表时,子表将进行全表扫描

[20160616]IOT与主外键.txt

[20160616]IOT与主外键.txt https://ilmarkerm.eu/blog/2016/06/interesting-difference-in-foreign-key-locking-behavior-between-heap-and-index-organized-tables --许多人都知道主外键引起的阻塞或者死锁,如果主表是IOT呢? IOT实际上一种特殊的索引结构,测试看看. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING    

[20140210]主外键和阻塞.txt

[20140210]主外键和阻塞.txt 许多人都知道如果几个表之间存在主外键关系的情况下,许多情况下会出现阻塞情况. 具体的例子还很多,当然如果我觉得最常见如果你不修改主外键值,外键的索引多数情况下可以不建. 而且有些外键的索引建立有点多余的. 今天我看了一篇blog,链接如下: http://blog.yavor.info/?p=564&lang=en 给出的例子很奇特,就是这个问题在11g下会出现阻塞,而10g下不会.12c下我也做了测试,也不会, 自己重复测试做一个记录: 1.12c的情

sql server中的外键约束

server sql server中建立外键约束有3中方式:1.Enterprise Manager中,Tables,Design Table,设置Table的properties,   可以建立constraint, reference key;2.Enterprise Manager中,Diagrams, new Diagrams,建立两个表的关系.3.直接用transact sql语句. 三个方法都需要先建立数据表.-- 创建表author :CREATE TABLE [dbo].[aut

在PowerDesigner中设计物理模型1——表和主外键

原文:在PowerDesigner中设计物理模型1--表和主外键 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念模型,然后由概念模型生成物理模型. 设计好逻辑模型,然后由逻辑模型生成物理模型. 使用逆向工程的方法,连接到现有的数据库,由数据库生成物理模型. 物理模型能够直观的反应出当前数据库的结构.在数据库中的表.视图.存储过程等数据库对象都可以在物理模型中进行设计.由于物理模型和数据库的一致性,接下来以数据库对象和物理模型对象的对应来一一介绍: 表 新建物理模型时需要指定