Java论坛网»Java技术»******************hibernate*********(200分)
******************hibernate*********(200分)
问?:
Query query = hiSession.createQuery("select id.bkxh from VtmcVehAlarmsusp where id.bjxh = :jlxh ");
query.setString("jlxh",AlarmId);
//执行到这里。抛出异常。
org.hibernate.PropertyValueException:
not-null property references a null or transient value: com.htits.vtmp.db.pojo.VtmcVehAlarm.gcjlxh
-----------------
发现问题:VtmcVehAlarm.gcjlxh这个字段是空的。但是在hibernate的xml中定义的时候定义了非空(not-null="true" )
问题是解决了。
可是在我读VtmcVehAlarmsusp这个表的时候,为什么会报VtmcVehAlarm.gcjlxh为空的错误呢?
query.setString("jlxh",AlarmId);
//执行到这里。抛出异常。
org.hibernate.PropertyValueException:
not-null property references a null or transient value: com.htits.vtmp.db.pojo.VtmcVehAlarm.gcjlxh
-----------------
发现问题:VtmcVehAlarm.gcjlxh这个字段是空的。但是在hibernate的xml中定义的时候定义了非空(not-null="true" )
问题是解决了。
可是在我读VtmcVehAlarmsusp这个表的时候,为什么会报VtmcVehAlarm.gcjlxh为空的错误呢?
答!: 1:
顶一个 呵呵
答!: 2:
元素的not-null属性
如果元素的not-null属性为true,表明不允许为null,默认为false。例如以下代码表明不允许Customer类的name属性为null:
<property name="name" column="NAME"
type="string" not-null="true" />
Hibernate在持久化一个Customer对象时,会先检查它的name属性是否为null,如果为null,就会抛出以下异常:
net.sf.hibernate.PropertyValueException:
not-null property references
a null or transient value:
mypack.Customer.name
如果数据库中CUSTOMERS表的NAME字段不允许为null,但在映射文件中没有设置not-null属性:
<property name="name" column="NAME"
type="string" />
那么Hibernate在持久化一个Customer对象时,不会先检查它的name属性是否为null,而是直接通过JDBC API向CUSTOMERS表插入相应的数据,由于CUSTOMERS表的NAME字段设置了not null约束,因此数据库会抛出错误:
708 ERROR JDBCExceptionReporter:
58 - General error, message from server:
"Column 'NAME' cannot be null"
值得注意的是,对于实际Java应用,当持久化一个Java对象时,不应该依赖Hibernate或数据库来负责数据验证。在四层应用结构中,应该由表述层或者业务逻辑层负责数据验证。例如对于Customer对象的name属性,事实上在表述层就能检查name属性是否为null,假如表述层、业务逻辑层和Hibernate持久化层都没有检查name属性是否为null,那么数据库层会监测到NAME字段违反了数据完整性约束,从而抛出异常,如图2-2所示,包含非法数据的Customer对象从表述层依次传到数据库层,随后从数据库层抛出的错误信息又依次传到表述层,这种做法显然会降低数据验证的效率。
如果元素的not-null属性为true,表明不允许为null,默认为false。例如以下代码表明不允许Customer类的name属性为null:
<property name="name" column="NAME"
type="string" not-null="true" />
Hibernate在持久化一个Customer对象时,会先检查它的name属性是否为null,如果为null,就会抛出以下异常:
net.sf.hibernate.PropertyValueException:
not-null property references
a null or transient value:
mypack.Customer.name
如果数据库中CUSTOMERS表的NAME字段不允许为null,但在映射文件中没有设置not-null属性:
<property name="name" column="NAME"
type="string" />
那么Hibernate在持久化一个Customer对象时,不会先检查它的name属性是否为null,而是直接通过JDBC API向CUSTOMERS表插入相应的数据,由于CUSTOMERS表的NAME字段设置了not null约束,因此数据库会抛出错误:
708 ERROR JDBCExceptionReporter:
58 - General error, message from server:
"Column 'NAME' cannot be null"
值得注意的是,对于实际Java应用,当持久化一个Java对象时,不应该依赖Hibernate或数据库来负责数据验证。在四层应用结构中,应该由表述层或者业务逻辑层负责数据验证。例如对于Customer对象的name属性,事实上在表述层就能检查name属性是否为null,假如表述层、业务逻辑层和Hibernate持久化层都没有检查name属性是否为null,那么数据库层会监测到NAME字段违反了数据完整性约束,从而抛出异常,如图2-2所示,包含非法数据的Customer对象从表述层依次传到数据库层,随后从数据库层抛出的错误信息又依次传到表述层,这种做法显然会降低数据验证的效率。
答!: 3:
“值得注意的是,对于实际Java应用,当持久化一个Java对象时,不应该依赖Hibernate或数据库来负责数据验证。在四层应用结构中,应该由表述层或者业务逻辑层负责数据验证。”
有这句就够了
有这句就够了
答!: 4:
你的程序和数据库设计不同步
答!: 5:
兄弟门。你们的回答都不靠谱啊。
---------------
我的问题是。为什么在我读取VtmcVehAlarmsusp这张表的时候。
报错信息却是VtmcVehAlarm.gcjlxh为空的错误呢?
也就是说在我读取VtmcVehAlarmsusp这个表的时候。hibernate内部调用了读取VtmcVehAlarm的操作。我就是想知道为什么会有这样的操作?什么时候有这样的操作?
现在我说的够明白了把。
---------------
我的问题是。为什么在我读取VtmcVehAlarmsusp这张表的时候。
报错信息却是VtmcVehAlarm.gcjlxh为空的错误呢?
也就是说在我读取VtmcVehAlarmsusp这个表的时候。hibernate内部调用了读取VtmcVehAlarm的操作。我就是想知道为什么会有这样的操作?什么时候有这样的操作?
现在我说的够明白了把。
答!: 6:
你的数据库的该字段的值是null的 肯定会有问题
答!: 7:
VtmcVehAlarmsusp是不是有一个属性是VtmcVehAlarm类型的
这种情况下
如果不延迟加载的话 查询VtmcVehAlarmsusp时,肯定会把它的这个属性查出来
这种情况下
如果不延迟加载的话 查询VtmcVehAlarmsusp时,肯定会把它的这个属性查出来
答!: 8:
没有。
不过他其中一个属性是联合主键。
主键中的一个是VtmcVehAlarm的主键。
但是这个对应关系没有在程序中。或xml中表现出来。数据库中也没设置外键。
不过他其中一个属性是联合主键。
主键中的一个是VtmcVehAlarm的主键。
但是这个对应关系没有在程序中。或xml中表现出来。数据库中也没设置外键。
答!: 9:
看看数据检索策略这方面的资料吧
立即检索和延迟检索
立即检索和延迟检索
答!: 10:
你的检索策略此时是立即检索;
如果你不设置lazy=true,hibernate里默认的策略是立即检索的
在读取表的时候,会把与其级联的其他表也一同读入缓存的
如果你不设置lazy=true,hibernate里默认的策略是立即检索的
在读取表的时候,会把与其级联的其他表也一同读入缓存的
答!: 11:
刚开始学习,有兴趣来逛了...
答!: 12:
<class name="com.htits.vtmp.db.pojo.VtmcVehAlarmsusp" table="VTMC_VEH_ALARMSUSP">
<composite-id name="id" class="com.htits.vtmp.db.pojo.VtmcVehAlarmsuspId">
<key-property name="bjxh" type="string">
<column name="BJXH" length="22" />
</key-property>
<key-property name="bkxh" type="string">
<column name="BKXH" length="22" />
</key-property>
</composite-id>
<property name="qrzt" type="string">
<column name="QRZT" length="2" />
</property>
</class>
------------------------------------------------------
都说了。在程序中和xml都没有表现她们之间的关联。
<composite-id name="id" class="com.htits.vtmp.db.pojo.VtmcVehAlarmsuspId">
<key-property name="bjxh" type="string">
<column name="BJXH" length="22" />
</key-property>
<key-property name="bkxh" type="string">
<column name="BKXH" length="22" />
</key-property>
</composite-id>
<property name="qrzt" type="string">
<column name="QRZT" length="2" />
</property>
</class>
------------------------------------------------------
都说了。在程序中和xml都没有表现她们之间的关联。
答!: 13:
把联合主键去了,试一下
还有你在VtmcVehAlarm中有没有配与VtmcVehAlarmsusp的关系
还有你在VtmcVehAlarm中有没有配与VtmcVehAlarmsusp的关系
答!: 14:
估计你的表里面有脏的数据,把表数据清空再添加然后去Query试试
答!: 15:
估计你的表里面有脏的数据,把表数据清空再添加然后去Query试试
答!: 16:
友情UP
相关JAVA教程:
请问在cmp ejb(2.1规范)怎样在find方法里指定 某时间字段 >= oracle的sysdate 这样的查询条件?
找不到好答案!!getServletContext()不是一个静态方法,为什么jsp中可以直接调用呢?
CVS是什么
请问高手jsp+tomcat5.0环境下,tomcat服务启动时,调用项目里某个线程类
求助,怎样配置xfire,使其发布的webservice可以直接被http请求访问啊?
初学Hibernate 出了点问题,希望大家帮忙解决
请问用java开发企业级应用时用什么IDE好?
Tomcat 如何反映真实结果的问题.
关于URI的一个问题
急!!!请问JBuilder工程如何移到Eclipse中去呢!!!!在线等待啊!!!!!!!!!!!!
JFileChooser的打开文件对话框如何做成模态对话框?
这个版面到底有多少个帖子是真正问“架构、设计”的?忒也奇怪了。