【问题标题】:ConstraintViolationException: Duplicate entry for key 'PRIMARY' when using Hibernate and MySQL?ConstraintViolationException:使用 Hibernate 和 MySQL 时键“PRIMARY”的重复条目?
【发布时间】:2012-10-13 07:41:58
【问题描述】:
    Session session = HibernateUtil.getTestSessionFactory().getCurrentSession();
    session.beginTransaction();
    session.save(test1);
    session.save(test2);
    session.save(test3);
    session.getTransaction().commit();

    WARN: SQL Error: 1062, SQLState: 23000
ERROR: Duplicate entry '9900001' for key 'PRIMARY'
WARNING: #{RmaBean.send}: org.hibernate.exception.ConstraintViolationException: Duplicate entry '9900001' for key 'PRIMARY'
javax.faces.FacesException: #{RmaBean.send}: org.hibernate.exception.ConstraintViolationException: Duplicate entry '9900001' for key 'PRIMARY'
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)

因此,当尝试将 test1 插入 db 时,我总是会遇到该异常。在插入该 test1 之前,我填充了它的 PK,从 DB 中获取最后一个 PK 并将 +1 添加到其中。 Hibernate 是否以某种方式将 pk 保存在内存中,我不应该使用 insert 而是更新?

更新:`

<class name="test1" table="test1" catalog="testing">
    <id name="testPK" type="long">
        <column name="testPK" />
        <generator class="assigned" />
    </id>`

这段代码是由另一个人实现的,我刚刚从数据库中检查了没有自动增量为真。已分配意味着我必须提供 PK 并且我正在尝试这样做。

public Integer getLastPK {


    Session session = HibernateUtil.getTestSessionFactory().getCurrentSession();
    Integer pk = null;
    try{

    session.beginTransaction();


    pk = new Integer(session.createSQLQuery("SELECT LAST_INSERT_ID() from testing.test1").uniqueResult().toString());  
    session.getTransaction().commit();

    System.out.println("1.....pk----------->"+pk);

    if(pk != null && pk <= 9900001){
        System.out.println("IF...");
        pk=9900001;

    }else if(pk != null && pk > 9900001){

        pk = pk+1;
    }

UPDATE2:我将 pk 更改为 Auto Increment:

ALTER TABLE testing.test1 AUTO_INCREMENT = 9900001 ,更改列 testPK testPK BIGINT(20) NOT NULL AUTO_INCREMENT ;

这是个好主意吗?我也更改了 hbm.xml 文件...

感谢您的帮助! 萨米人

【问题讨论】:

  • 能否提供测试类的hbm文件
  • 显示代码,如何使用主键创建 test1、test2、test3 对象

标签: java mysql hibernate primary-key


【解决方案1】:

session.saveOrUpdate(test1)代替session.save(test1);怎么样?

saveOrUpdate(Object object) 是

保存(对象)或更新(对象)给定的实例,取决于 在解决未保存值检查时。

http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/Session.html

【讨论】:

  • -1??我试过了,我得到了: WARN: SQL Error: 1062, SQLState: 23000 ERROR: Duplicate entry '9900001-1' for key 'PRIMARY' WARNING: #{RmaBean.lahetaLahetys}: org.hibernate.exception.ConstraintViolationException: Duplicate entry '9900001-1' for key 'PRIMARY' javax.faces.FacesException: #{RmaBean.lahetaLahetys}: org.hibernate.exception.ConstraintViolationException: Duplicate entry '9900001-1' for key 'PRIMARY' 我将更新我的问题我正在获取 PK 的代码...
  • 对不起,我不是那个意思 :) 我的意思是 9900001-1。奇怪的例外。
  • 如果两个线程将同一条记录插入表中,则无法解决问题。
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2012-08-24
  • 2014-05-30
  • 2017-06-19
相关资源
最近更新 更多