Struts2-Hibernate采坑记录(2)(Hibernate下Map集合属性映射问题,使用Navicate设置MySQL数据库外键问题)

Struts2-Hibernate采坑记录(2)

踩坑1—外键设置后点击保存之后消失

   在使用Navicat操作MySQL数据库的时候,我们会遇到两个数据库进行相关联的情况,此时就需要用到数据库外键的知识。同时,我们应当注意分清出外键应该在哪个表中进行设置(下面进行举例子):

表 A(stuId, stuName,stuPhone)

表 B(stuId, stuAddress, stuDetails)

需求:需要将B表格中的stuId与A表格中的stuId进行关联,此时我们认为A表格是主要的表格(可以通过框架进行操作的表格,而B表格是不可以用代码进行操作的),也就是说在更新A表格的时候,B表格进行同步更新。那么,我们就需要在B表格中设置外键,进行关联。

使用Navicat操作MySQL数据库设置外键步骤如下:

第一步:设置数据库的引擎为InnoDB格式。

  1. 打开Navicate工具à选中表à点击“设计表”。

  1. 点击“选项”—>点击“选项”à选择InnoDB。(具体原因是:在MySQL中,InnoDB和MyISAM是许多人最常用的两个表类型,这两个表类型各有优劣,视具体情况而定。两者的基本差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。)

第二步:点击选项中的“外键”à会出现7列(其中第一列“名”不需要我们添加,后边点击保存后会自动生成;其他6列根据提示添加)à添加完后,点击保存即可。

注意事项

在填写“删除时”选择SET NULL表示:删除主表A的相关记录的时候会设置B表格中的相关记录为NULL。

在选择CASCADE的时候表示的是:更新主表的时候会关联更新B表。

此时,通过使用Navicat操作MySQL数据库进行外键的设置完成。

踩坑2——在配置Hibenrate集合属性映射的时候遇到的很诡异的问题:

ERROR ExceptionMapperStandardImpl HHH000346: Error during managed flush [class java.util.Locale cannot be cast to class java.lang.String (java.util.Locale and java.lang.String are in module java.base of loader 'bootstrap')]

这句话翻译过来就是:

错误异常ApperStandardImpl HHH000346:托管刷新期间出错[类java.util.Locale不能转换为类java.lang.String(java.util.Locale和java.lang.String位于加载程序“bootstrap”的模块java.base中)]

解决办法:

这一点是自己的小聪明导致的,我在自定义的转换器Conveter类中,Conveter类继承了StrutsTypeConverter类,并且覆盖了两个方法:convertFromString方法,方法头如下:

public Object convertFromString(Map map, String[] strings, Class aClass) {}

其中方法头中的map对象是上下文对象,我却直接和题目中使用的map结合,直接在方法的返回中写了return map,(误认为就是map对象,才直接赋值)

这一点希望大家在覆盖写此方法的时候应当注意,不要觉得在实体类中设置了集合属性map,然后直接在自定义转换器中直接返回方法自带的map对象,这样写会报上面的错误。

此问题的解决方法就是:在方法中定义一个新的map集合即可。然后将前端传来的值赋值过去即可。

踩坑3——前端显示: ognl.NoConversionPossible错误。

分析原因是:

  1. 可能是出现了懒加载,一般在一对多或者是多对多关系中会出现。懒加载的意思就是在session关闭之前如果没有访问想要得到结果的话,会出现在session关闭之后得不到数据的问题。

这种情况的解决方法是:在xxx.hbm.xml文件中,我们设置的时候需要注意在配置集合映射的时候,需要在设置集合属性的时候配置如下语句:

<map name="School" table="education" cascade="save-update" lazy="false"></map>中设置:lazy=”false”(默认是 true)

      这样设置即可。

      2.但是如果上边的设置修改后没有任何作用那么,还有一种可能就是很容易忽略的转换器设置。在设置转换器的时候一般需要将自己的设置的类继承StrutsTypeConverter类。此时,由于是前端页面设置有问题,那么我们只要注意convertFromString方法即可。在该方法中,原来设置的是:

Map<String,String> get_result = (HashMap<String,String>)o;

后来我将这句代码改成了:

Map<String,String> get_result = (Map<String,String>)o;

之后,这个问题就解决了。

踩坑4——在hibernate文件中设置map集合映射,后端数据库设置问题,出现异常: Duplicate entry “x” for key “x”)。

分析原因:这句话的意思是:x键重复。那么我就想到了,在我的POJO类(持久化类)中我设置了集合属性map,这一个属性在设置的时候是会有出现连续多次设置,同时也会像后端数据库中出现多次的insert into语句,也就是说在一个pojo类中如果存一个集合属性与一个数据库中的表对应,并且在这个表中有一个属性是有一个主表的外键的时候会出现这样的情况,那么此时解决问题的方法就是,将集合属性对应的表的外键属性一定不要设置成主键。否则,就会出现上述的报错。

踩坑5——在前端的jsp页面中使用<s:if test=”xxx”></s:if>进行判断的时候的注意事项。

       我们需要注意的是,当我们在使用同一个form表单的时候我们需要根据是否存在某一个对象来判断action的跳转,当我们想到要使用该对象的某一个属性进行判断的时候会出现xxx.属性名==null失效的情况,这一问题的解决方法是,在进行判断的时候,我们应当使用的是直接判断某一个对象是否是空(例如:<s:if test=”xxx==null”></s:if>即可。】

以上仅是我的个人观点但是都经过测试没有问题,有不足之处还望批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wyypersist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值