Hibernate中一对多关系中的空数据问题?

gdx 2003-09-28 12:15:58
Hibernate中当存在一对多关系时,如公司--员工的映射,
public class Employee{
Company company;
...
public Company getCompany(){
return company;
}
}
public class Company{
Set employee;
}
Employee映射文件:(Employee.hbm.xml)
<many-to-one
name="company"
class="eg.Company"
cascade="none"
column="company"/>
此时,如果Employee表中company字段中存在与Company表中主键不同的数据或者该项为null,则无法调用employee.getCompany(),返回异常:
net.sf.hibernate.ObjectNotFoundException:
No row with the given identifier exists:
, of class: com.withub.justice.instance.Occupation
请各位Hibernate高手帮忙!
...全文
90 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdx 2003-10-15
  • 打赏
  • 举报
回复
Hibernate论坛的回答是:
当关联字段是null值,返回的对象也是null,
但如果关联字段是脏数据,则会报异常。除非整理数据!
还是要谢谢大家~
outlier 2003-09-28
  • 打赏
  • 举报
回复
关注,我还没调通。是不是Hibernate不支持sql server啊?
squallzeng 2003-09-28
  • 打赏
  • 举报
回复
http://forum.hibernate.org.cn/
这个地方有答案的吧
或者这篇文章对你也是有用的
http://www.csdn.net/develop/read_article.asp?id=20945
Schlemiel 2003-09-28
  • 打赏
  • 举报
回复
作为外键的数据项,在我看来就应该是not-null的。譬如你的问题,每个人天生地就有国籍,怎么可能让“国籍为null”的这种实体存在呢?它的存在本身就是不合逻辑的,就应该引发一个异常,不是吗?你说“但在客户提交的信息中,并没有填写国籍信息”,很简单,在Hibernate映射描述里把这个field设置为not-null,不填这条信息就不让他提交,直接把异常抛还给他好了。
gdx 2003-09-28
  • 打赏
  • 举报
回复
可能没说清楚,异常在
Query q = session.createQuery(
"from ProsecutionParty party "
);
List list = q.list();
查询(q.list)时发生。
gdx 2003-09-28
  • 打赏
  • 举报
回复
空值(null)的存在虽然违反数据完整性,可是在实际情况下是存在的。
比如:客户对象中有国籍属性,并与国籍表相关联。
但在客户提交的信息中,并没有填写国籍信息,这时数据存储可能是null值。
Hibernate装载对象如Customer时会读属性信息,当其不能由null实例化国籍对象时,就会抛
出异常。
不知是否有在Hibernat的映射文件或在程序中控制的办法?请教!
Schlemiel 2003-09-28
  • 打赏
  • 举报
回复
或者,如果你的系统允许“不属于任何企业的员工”这样一种实体存在的话,那么是可以允许Employee的Company属性为null的。这时如果你调用employee.getCompany()方法,就必须自己捕捉ObjectNotFoundException,并告诉用户:这个员工是没有公司管的。
Schlemiel 2003-09-28
  • 打赏
  • 举报
回复
这是个数据约束条件的问题。“如果Employee表中company字段中存在与Company表中主键不同的数据或者该项为null”,这种情况根本就不应该发生,因为company字段是Employee表的外键,它是受到Company表中数据的约束的,不可以随便修改。如果遇到这种情况,直接把异常抛出去,告诉用户不要乱改数据好了。
gdx 2003-09-28
  • 打赏
  • 举报
回复
难道没有用Hibernate的吗?建议版主设Hibernate专栏

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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