关于外键映射?

venus224 2008-07-29 09:12:07
我在数据库中,设置有外键!
生成的代码如下:

<hibernate-mapping>
<class name="com.ehr.vo.TNode" table="t_node" lazy="true">
<id name="uid" type="java.lang.Integer">
<column name="uid" />
<generator class="native" />
</id>
<many-to-one name="TEnterprise" class="com.ehr.vo.TEnterprise" fetch="select">
<column name="enterprise_ID" not-null="true" />
</many-to-one>

<property name="nodeId" type="java.lang.String">
<column name="node_ID" length="10" not-null="true" />
</property>...

我现在的想法是程序中,不对外键操作!
把<many-to-one name="TEnterprise" class="com.ehr.vo.TEnterprise" fetch="select">
<column name="enterprise_ID" not-null="true" />
</many-to-one>
改成
<property name="enterpriseId" type="java.lang.String">
<column name="enterprise_ID" not-null="true" />
</property>
就是在配置映射文件和程序中把它当作没有外键处理!
这样,对程序的增,删,改,查会不会出错(本项目可以不要级联删除和更新)?
望高手指教!分不够可再加!
...全文
180 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
venus224 2008-07-30
  • 打赏
  • 举报
回复
那我要怎么处理外键呢?
外键全部映射成对象了!
我在update,insert时如何对这个对象操作呢?
假设我的pojo类是 Employee。我要更新 enterprise_ID这个字段,可是这个字段映射成对象:TEnterprise
<many-to-one name="TEnterprise" class="com.ehr.vo.TEnterprise" fetch="select">
<column name="enterprise_ID" not-null="true" />
</many-to-one>
public ActionForward update(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
TEmployeeForm temployeeForm=new TEmployeeForm();
TEmployee temployee=new TEmployee();
这里如何保存从页面传过来的数据?
temployee.setTEnterprise(temployeForm.getTEnterprise())---这里会出错!
}
actionform和pojo要做哪些变动?要不要自己添加employeeId?
actionform中是写employeeId还是TEnterprise;
venus224 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhouzongxi 的回复:]
你那样做插入的话也只是一个表中的字段啊。
当然你如果这个字段在另外个表中当主键 而你当前的pojo里面写了这个字段做为普通字段
数据库中没有这个字段
插入的时候当然会出错啊。
这样做没多大意义!!
[/Quote]
那我要怎么处理外键呢?
外键全部映射成对象了!
我在update,insert时如何对这个对象操作呢?
假设我的pojo类是 Employee。我要更新 enterprise_ID这个字段,可是这个字段映射成对象:TEnterprise
<many-to-one name="TEnterprise" class="com.ehr.vo.TEnterprise" fetch="select">
<column name="enterprise_ID" not-null="true" />
</many-to-one>
public ActionForward update(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
TEmployeeForm temployeeForm=new TEmployeeForm();
TEmployee temployee=new TEmployee();
这里如何保存从页面传过来的数据?
temployee.setTEnterprise(temployeForm.getTEnterprise())---这里会出错!
}
actionform和pojo要做哪些变动?要不要自己添加employeeId?
actionform中是写employeeId还是TEnterprise;
zhouzongxi 2008-07-30
  • 打赏
  • 举报
回复
你那样做插入的话也只是一个表中的字段啊。
当然你如果这个字段在另外个表中当主键 而你当前的pojo里面写了这个字段做为普通字段
数据库中没有这个字段
插入的时候当然会出错啊。
这样做没多大意义!!
Landor2004 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 venus224 的回复:]
引用 8 楼 Landor2004 的回复:
我在数据库中是有外键!
那样会出什么麻烦?
能不能给我一个级联删除和更新的例子
邮箱:venusdeng224@163.com
[/Quote]
你到底要什么?数据库中有关联,当你插入一个不是外键的内容的时候,就会报错
联机的时候增删改查会有什么问题,你要从业务的角度来考虑

例子在网上有的是的
venus224 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhuzy2004 的回复:]
可以这样做
[/Quote]
那会不会出错呢?
我现在是不确定!
zhuzy2004 2008-07-30
  • 打赏
  • 举报
回复
可以这样做
venus224 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Landor2004 的回复:]
可以,就当它是一个普通字段配置即可,
不过数据库中真有主外键约束的话,程序插入了不是外键的内容,会出麻烦
[/Quote]
我在数据库中是有外键!
那样会出什么麻烦?
能不能给我一个级联删除和更新的例子
邮箱:venusdeng224@163.com
Landor2004 2008-07-30
  • 打赏
  • 举报
回复
可以,就当它是一个普通字段配置即可,
不过数据库中真有主外键约束的话,程序插入了不是外键的内容,会出麻烦
venus224 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhouzongxi 的回复:]
你这样不符合hibernate的机制吧
他操作的都是对象。
既然你把他当做属性 那也只是你这个表中的属性,而不能说明是其他表(对象)的属性啊。
也就是你可以用这个属性对你当前的这个对象进行操作。
[/Quote]
能说清楚点吗?
venus224 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 havelock 的回复:]
不会出错.

但是 难道你认为没有约束的数据库跑起来很爽吗?
[/Quote]
约束我在数据库中有!
我只是不在程序中实现!
我在数据库中设置可以实现吗?
zidasine 2008-07-30
  • 打赏
  • 举报
回复
感觉没什么不可以
只要自己用着方便
havelock 2008-07-30
  • 打赏
  • 举报
回复
不会出错.

但是 难道你认为没有约束的数据库跑起来很爽吗?
zhouzongxi 2008-07-30
  • 打赏
  • 举报
回复
你这样不符合hibernate的机制吧
他操作的都是对象。
既然你把他当做属性 那也只是你这个表中的属性,而不能说明是其他表(对象)的属性啊。
也就是你可以用这个属性对你当前的这个对象进行操作。
venus224 2008-07-30
  • 打赏
  • 举报
回复
没有人懂??
venus224 2008-07-30
  • 打赏
  • 举报
回复
欢迎大家来讨论!
venus224 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Landor2004 的回复:]
你就是想把t_node表的enterprise_ID字段更新成enterprise表里的另一个值对吧
大概代码如下

Java code TEnterprise tEnterprise = new TEnterprise();
tEnterprise.setPersonID(71);//如果你的是从form中取得,那要确认temployeForm.getTEnterprise()中的TEnterprise的id在数据库的表中是否有对应

TEmployee temployee = new TEmployee();
temployee.setTEnterprise(tEnterprise);

[/Quote]
大哥,好人!
venus224 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 thevone 的回复:]
最好别用hiberntate的级联约束,容易出错,用程序控制吧,反正你数据库中都做了约束。
[/Quote]
这个想法不错!
那我的配置要怎么改?
xiaoxiao321 2008-07-30
  • 打赏
  • 举报
回复
感觉楼主首先就应该确定,你需要不需要这个外健,如果不需要外健的功能,不用这么麻烦吧
thevone 2008-07-30
  • 打赏
  • 举报
回复
最好别用hiberntate的级联约束,容易出错,用程序控制吧,反正你数据库中都做了约束。
Landor2004 2008-07-30
  • 打赏
  • 举报
回复
你就是想把t_node表的enterprise_ID字段更新成enterprise表里的另一个值对吧
大概代码如下
		TEnterprise tEnterprise = new TEnterprise();
tEnterprise.setPersonID(71);//如果你的是从form中取得,那要确认temployeForm.getTEnterprise()中的TEnterprise的id在数据库的表中是否有对应

TEmployee temployee = new TEmployee();
temployee.setTEnterprise(tEnterprise);
......
getHibernateTemplate().saveOrUpdate(temployee);
加载更多回复(2)

67,513

社区成员

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

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