一段hibernate的SchemaExport,原来在win下运行正常,放到linux下就出了问题,在插入数据的时候发生了异常:
2009-01-30 11:59:19,555 -WARN- org.hibernate.util.JDBCExceptionReporter:77 SQL Error: 1062, SQLState: 23000
2009-01-30 11:59:19,556 -ERROR- org.hibernate.util.JDBCExceptionReporter:78 Duplicate entry '???' for key 2
2009-01-30 11:59:19,562 -ERROR- org.hibernate.event.def.AbstractFlushingEventListener:301 Could not synchronize database
state with session
org.hibernate.exception.ConstraintViolationException: could not insert:
Caused by: java.sql.BatchUpdateException: Duplicate entry '???' for key 2
第一反应是SchemaExport的问题,后来才想到人家才不会那么耦合:P
上网搜,都是说主键generator的问题,和我遇到的并不相符。
后来装了mysql的administrator,找到了原因。表引擎都变成了MyISAM,而不是期望的InnoDB。我的代码是在用到batch的时候(Session.flush())才出的错,查了查MyISAM的资料,应该就是这个了。
编辑了etc/mysql/my.cnf,在[mysqld]下面追加了
default-storage-engine=INNODB。
PS:在win下我不记得有配过这个设置,有可能是操作系统的默认引擎不一样,回公司的时候查一下吧:)
另外忘了改Default Character Set,也需要变成UTF-8才可以:
default-character-set=utf8
PS:需要把原DB删掉重建才管用。