Xice
2013-04-11 09:30
采纳率: 100%
浏览 505
已采纳

hibernate3.3+mysql日期格式Date类型,无法进行相等的比较

hibernate3.3+mysql,数据库表是联合主键,其中一个为Date类型。此时对日期进行比较时,结果不正确。应该如何修改?

表结构:
CREATE TABLE temp (
room_id int(11) NOT NULL,
priceDate date NOT NULL,
value varchar(20) DEFAULT NULL,
PRIMARY KEY (room_id,priceDate)
);

映射文件:










测试代码大致如下:
Date tempDate = DateUtils.parseDate("2013-04-10");
TempId id = new TempId(1, tempDate);

Temp temp = new Temp(id, "123");
save(temp);
Temp savedTemp = load(Temp.class, id);
System.out.println(savedTemp);

------预计结果------
Temp@*****
------实际结果------
null

测试代码里的save和load,都是直接使用的getHibernateTemplate()里的save和load。
日期转换DateUtils.parseDate是用的SimpleDateFormat将字符串转为日期,格式为yyyy-MM-dd。
为什么load不到结果呢?原有的数据库设计就是这样的,目前无法进行结构与类型的修改。
现在需要对这样的表进行批量新增与更新数据,这时hibernate会自动使用load方法去根据ID判断是否存在数据,如果load结果为null,就会进行插入,这时就会报错,主键唯一约束的错误。
请大家帮忙看看,有没有什么好的解决办法???

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • jinbingchuan 2013-04-11 09:41
    已采纳

    你可以看下官方文档

    需要重写联合主键类的hashcode()和equals()
    hashcode()只需要返回其中一个String类型的hashcode就行
    equals()需要判断联合主键类的各个属性都相同,才能返回true,反之.

    给你一个例子
    http://yangfei520.blog.51cto.com/1041581/310555

    打赏 评论
  • zyn010101 2013-04-11 09:53

    重新TypeId的equals()和hashcode(),你可以参考一下《深入浅出hibernate 》的复合主键一节,[url]http://ishare.iask.sina.com.cn/f/23245490.html?from=like[/url]

    打赏 评论
  • helinherong_fan 2013-04-11 15:37

    重写com.boang.hotel.entity.TempId类的equals和hashcode方法

    打赏 评论

相关推荐 更多相似问题