Plat Framework 1.2.7 升级到 1.5.2 后出现 MySQLIntegrityConstraintViolationException

标签 mysql hibernate playframework

由于我的服务器上的 Java 和发行版更新,我需要更新我的 Play Framework 1 应用程序。

对 JDK 1.8 进行必要的更改后,一切似乎都正常。但是,当插入新记录时,出现以下错误。

08:49:44,922 ERROR ~ Error during device update (Job): org.hibernate.exception.ConstraintViolationException: could not execute statement
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1460)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1440)
    at play.db.jpa.JPABase._save(JPABase.java:58)
    at play.db.jpa.GenericModel.create(GenericModel.java:375)
    at models.Device.createDevice(Device.java:154)
    at logic.helpers.DevicePerformer.doJobWithResult(DevicePerformer.java:104)
    at logic.helpers.DevicePerformer.doJobWithResult(DevicePerformer.java:1)
    at play.jobs.Job$2.apply(Job.java:224)
    at play.db.jpa.JPA.withTransaction(JPA.java:285)
    at play.db.jpa.JPA.withinFilter(JPA.java:238)
    at play.db.jpa.JPAPlugin$TransactionalFilter.withinFilter(JPAPlugin.java:304)
    at play.jobs.Job.withinFilter(Job.java:201)
    at play.jobs.Job.call(Job.java:220)
    at play.jobs.Job$1.call(Job.java:135)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3171)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3686)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:90)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:380)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454)
    ... 19 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '215' for key 'PRIMARY'
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
    at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)
    ... 27 more

MySQL 告诉我下一个索引是 44806,这正是我所期望的。

我有两台服务器,当仅运行旧代码(Play 1.2.7)时,它工作正常,并按预期给了我一个 ID。两个服务器使用相同的数据库。

这是新的实现,给出了较低的值(在下面的示例中为 215),因此不得使用数据库中的值,而是使用其他值。我确实注意到一个名为 hibernate_sequence 的表,其中包含一个“next_val”字段,它确实给出了值接近 215。它有 25 行,其中一列的数字全部相同。

新的 Hibernate 实现是否发生了一些变化,因此我需要进行一些更改才能再次使用“下一个自动索引”?

最佳答案

不同之处在于 Hibernate 5 未指定生成策略会导致 Hibernate 使用自己的策略。

可以通过以下注释来使用 MySQL 值:

@GeneratedValue(strategy = GenerationType.IDENTITY)

关于Plat Framework 1.2.7 升级到 1.5.2 后出现 MySQLIntegrityConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53258796/

相关文章:

mysql - 在 mySQL 中表示新闻帖子

php - 隐藏或删除下拉列表中的条目

hibernate - 陈旧状态异常 : Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Java - Hibernate @ManyToMany 映射仅在一个方向上添加数据库中的记录

java - 在 Action 组合中获取 url 参数

java - 没有 EntityManager 绑定(bind)到全局?尝试从 onHandlerNotFound 进行事务处理

mysql - 内部连接而不是内部选择效果不佳

php - MySQL UNION - 将两个单值查询输出到不同的列中

hibernate - 单向一对多关系查询GORM grails

java - 玩2.3.x : Non-blocking image upload to Amazon S3