【问题标题】:MySql in WinXP and Mac OS XWinXP 和 Mac OS X 中的 MySql
【发布时间】:2009-06-20 22:49:54
【问题描述】:

我正面临这个奇怪的问题。 我在我的机器上用 Win XP 编码,然后将所有代码移到 Mac OS X 机器上。 使用 XP 机器上的 jar 运行它。 我正在用java编码并使用hibernate进行数据库处理。

不知何故,我无法插入一行,而键是使用增量生成器类生成的。我也在 Mac 上尝试了本机但同样的错误。

这里是调试模式。现在,我知道该错误是密钥违规,但在 WinXP 中不会发生同样的情况。我在运行代码之前截断了我的数据库。我认为它们是 Mac 中的一些生成器类依赖项。还是其他罐子?

这里有一些细节:

  • Mac OS X 10.5 (x86_64)
  • MYSQL 5.1.35 社区服务器
  • mysql-connector-java-5.1.7-bin.jar JDBC驱动
  • Java(TM) 2 运行时环境,标准版(内部版本 1.5.0_16-b06-284)
  • Java HotSpot(TM) 客户端 VM(内部版本 1.5.0_16-133,混合模式,共享)

请指教

2009-06-20 18:43:01,230 DEBUG [org.hibernate.type.IntegerType] - binding '11266' to parameter: 2
2009-06-20 18:43:01,230 DEBUG [org.hibernate.type.IntegerType] - binding '332' to parameter: 3
2009-06-20 18:43:01,281 DEBUG [org.hibernate.type.IntegerType] - binding '6' to parameter: 4
2009-06-20 18:43:01,281 DEBUG [org.hibernate.persister.entity.AbstractEntityPersister] - Inserting entity: [org.joshua.hibernate.dto.Pagedatecounts#289]
2009-06-20 18:43:01,281 DEBUG [org.hibernate.jdbc.AbstractBatcher] - Executing batch size: 1
2009-06-20 18:43:01,288 DEBUG [org.hibernate.jdbc.AbstractBatcher] - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2009-06-20 18:43:01,288 DEBUG [org.hibernate.jdbc.AbstractBatcher] - closing statement
2009-06-20 18:43:01,289 DEBUG [org.hibernate.util.JDBCExceptionReporter] - Could not execute JDBC batch update [insert into wiki.page (langId, titleId, totalCounts, id) values (?, ?, ?, ?)]
java.sql.BatchUpdateException: Duplicate entry '1-11266' for key 'Page_lang_title'
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1693)
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1108)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2224)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.joshua.hibernate.dao.PageDAO.batchSave(PageDAO.java:70)
    at org.joshua.businesservice.PageServiceImpl.savePageDateCountBatch(PageServiceImpl.java:61)
    at org.joshua.wikidumps.DumpHandler.endElement(DumpHandler.java:192)
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:375)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:176)
    at org.joshua.wikidumps.PagesByNumberOfRecentEdits.execute(PagesByNumberOfRecentEdits.java:107)
    at org.joshua.wikidumps.PagesByNumberOfRecentEdits_ur.main(PagesByNumberOfRecentEdits_ur.java:19)
2009-06-20 18:43:01,290 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 1062, SQLState: 23000
2009-06-20 18:43:01,290 ERROR [org.hibernate.util.JDBCExceptionReporter] - Duplicate entry '1-11266' for key 'Page_lang_title'
2009-06-20 18:43:01,290 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

【问题讨论】:

  • 你在 Mac OS X 上使用什么 JVM?
  • MySQL服务器和JDBC驱动是什么版本?当版本不匹配时,我看到了奇怪的错误。
  • 我的 MYSQL 版本是服务器版本:5.1.35 MySQL Community Server (GPL) 和 JDBC 驱动程序是 mysql-connector-java-5.1.7-bin.jar 最后是 Java(TM) 2 Runtime Environment , 标准版 (build 1.5.0_16-b06-284) Java HotSpot(TM) Client VM (build 1.5.0_16-133, 混合模式, 共享)
  • MAC 也是 Mac OS X 10.5 (x86_64)
  • 你能发布你的hibernate.xml吗?

标签: java mysql hibernate macos mysql-error-1062


【解决方案1】:

没什么可做的,但这是我能做到的:

  1. 违反的唯一键是标题和语言列上的组合键。 (从stacktrace中显示的名称(Page_lang_title,其中lang_id和title_id是列名)和键的值(1-11266,实际上是两个值的组合)来看)。
  2. 您维护一个页面(请求?)计入一个 wiki 页面。这当然容易出现并发问题,因为多个线程(请求)同时访问同一个页面。
  3. 您可能正在执行批量更新(或其他操作),并且您两次点击了相同的 组合。您的逻辑类似于“来自 page_id=? 和 lang_id=? 的页面”由于您在同一事务中运行批处理并在事务同步后使用休眠,因此您在表上的插入仅在您提交事务后才被处理,因此您尝试插入 lang_id 和 page_id 的相同组合两次。

现在你可以做一些事情:

  1. 确保 Hibernate 的 AUTO_FLUSH 模式正常工作,以便在需要插入新实体时刷新会话对该表进行查询之前。要使这项工作按预期进行,您必须确保 Hibernate 知道已启动的事务。
  2. 维护您自己为每个事务创建的 Pagedatecount 缓存,并在使用 Hibernate 检查数据库之前对其进行查询。

想一想:Pagedatecount 实体不是缺少日期列吗?它似乎没有被插入。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。不知道你是否已经解决了。无论如何,就我而言,这是 MySQL 如何创建表和执行表名比较的问题。在 MacOsX 上,我必须将“lower_case_table_names”MySQL 变量设置为 1(默认为 0),这是使用 InnoDB 时的建议值。这解决了我的问题(就像您一样,Hibernate 似乎没有获取自动生成的 ID)。

    希望这可能会有所帮助, 里卡多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-24
      • 2014-03-14
      • 1970-01-01
      • 2011-07-27
      • 2012-01-31
      • 2013-03-03
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多