hibernate中多对一问题!很严重!

conrol 2008-10-30 12:15:25
请教大家一个问题
在使用hibernate中有2个对象,Student,School,他们之间的关系是多对一,现在我要检索Student,如果我把Student对应的School记录在数据库删除的话,当调用Student.getSchool().getName()方法时什么也不输出,用Junit测试的时候,报错,请问如何解决?先谢谢大家了
...全文
185 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
耶律火柴 2008-10-31
  • 打赏
  • 举报
回复
if(student.getSchool() != null){
student.getSchool().getName();
}else{
out("学校不存在");
}
CHR_WHY 2008-10-31
  • 打赏
  • 举报
回复
可以解决
就是在调用student.getSchool.getName()时,捕捉一个异常ObjectNotFoundException
若出现了这个异常,则提示没有读取出来
CHR_WHY 2008-10-31
  • 打赏
  • 举报
回复
getSchool()已经是一个空对象了,更别说getName()了
时光瞄 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liliang1222 的回复:]
不明白你的意思,都删除了,怎么得到呢
[/Quote]
同问...
yuanyon7 2008-10-31
  • 打赏
  • 举报
回复

楼主是通过load方法加载的吧 换成get 就返回 null
load 查询如果不存在就报 ObjectNotFoundException异常
bdceo 2008-10-31
  • 打赏
  • 举报
回复
看了你的详细需求我明白了,你是相同过Student得到School的信息。
你可以这样,首先在Hibernate中查询,我们有两种方式load()和get();
用get()查询,因为它返回的是一个对象,既是说查不到返回的也会是个null,而load查不到会有异常的!

其实我倒感觉你的数据库设计有问题,就是这两张表之间的主外键关系,
当然,如果我们在Hibernate映射文件中配置好多对一关系并添加级联删除属性的话,一样可以实现主外键关联。
不过,最好还是在数据库中有明确的设计。

再有我还感觉到你的这个关系没搞好吧,是一对一呢还是多对一啊?
Student.getSchool().getName()——你这样写的话,好想是一对一吧?
我看你的问题还是不确定!所以希望你可以把两个表的映射文件内容发上来……

bdceo 2008-10-31
  • 打赏
  • 举报
回复
“如果我把Student对应的School记录在数据库删除的话,当调用Student.getSchool().getName()方法时什么也不输出,用Junit测试的时候,报错”
——>
既然你都把Student对应的School记录删除了
再用Student.getSchool().getName()还怎么会有相应的记录呢?
测试报错是空指针了吧?
再者你这是什么逻辑啊?测试什么东西嘛!主外键没搭好吧?
你要是手动在数据库删除School记录时应该有主外键约束吧?不知道你的数据库是怎么设计的
?????????????????????????????????????????????????????????????????????????
wangzhuoyan 2008-10-31
  • 打赏
  • 举报
回复
这种关系一定要建立关联,一旦一方删除,另一方级联删除,并且主动方放在多的一方,这样不会出现问题了就
njliuqi 2008-10-31
  • 打赏
  • 举报
回复
student.getSchoolObj().getName();
先获得对象再取名字
jianpc 2008-10-30
  • 打赏
  • 举报
回复
你的student表有有一条记录,比如他的学校id是1,然后你在学校表里面把id为1的记录删掉了。但是student里面记录没有任何改动。所以你去查的时候,student的学校id仍为1,但通过这个学校id,找不到记录。就报这个错误了。No row with the given identifier exists。可以在数据库里面设置他们级联删除的策略(你应该没有设置外键),或者在实现的时候用代码来判断。
yzsunlight 2008-10-30
  • 打赏
  • 举报
回复
楼主这个抱异常是肯定的,我通过对你所说的了解,可能你在表里面school和student 没有建立关系
现在你通过student.getSchool.getName 去调用方法时, 因为student.getSchool 肯定是没有对象的
所以抱了 

org.hibernate.ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:27)
对象不能发现异常
conrol 2008-10-30
  • 打赏
  • 举报
回复
对不起,我说的明确一点,譬如我数据库中有2个表,一个是student,一个是school,他们在hibernate里对应的关系是多对一,现在我不小心把school里的一条记录删除了,我在查找这条删除记录的student时,级联查询到对应的school,但是现在school已经删除,所以在获取student.getSchool.getName()(获取学校名子)时报异常,如下org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [org.ld.vo.Classes#7]
at org.hibernate.ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:27)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:128)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
at org.hibernate.type.EntityType.resolve(EntityType.java:303)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
at org.hibernate.loader.Loader.doQuery(Loader.java:717)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1785)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:47)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:41)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:82)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:820)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:62)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
at org.ld.vo.Student$$EnhancerByCGLIB$$4f3b49c3.getStuName(<generated>)
at org.ld.test.manytooneTest.testLoad2(manytooneTest.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

我想问的是如何解决这个问题,不报出异常,当getSchool()时返回的是null
zjc_love 2008-10-30
  • 打赏
  • 举报
回复
如果我把Student对应的School记录在数据库删除的话,当调用Student.getSchool().getName()方法时什么也不输出?
Student.getSchool()还能返回对象吗?
都删除了。。。还能加载对象?不能加载对象还能得到对象的值?
你应该在删除school记录的时候判断是否有Student 如果有,你还删,当然以后就取空了。。。
liliang1222 2008-10-30
  • 打赏
  • 举报
回复
不明白你的意思,都删除了,怎么得到呢
logonin 2008-10-30
  • 打赏
  • 举报
回复
Student.getSchool().getName()这个得到的是学校的名称吗?
学生对象去调用学校名称吗?
设计还是存在问题的,感觉关系不是很明朗
这个问题算是个逻辑问题,楼主把存在什么和想要什么的问题想清楚了就容易多了
forestking_xx 2008-10-30
  • 打赏
  • 举报
回复
如果我把Student对应的School记录在数据库删除的话,当调用Student.getSchool().getName()方法时什么也不输出?

这句话什么意思呀?
guojianpeng9806 2008-10-30
  • 打赏
  • 举报
回复
回答错误了,可以无视
guojianpeng9806 2008-10-30
  • 打赏
  • 举报
回复
Student,School两个表去掉关联约束

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧