ConstraintViolationException:使用Hibernate和MySQL时键'PRIMARY'的重复条目?

时间:2012-10-23 11:22:37

标签: java mysql hibernate primary-key

    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>`

这段代码是由另一个人实现的,我刚从db检查过没有Auto Increment为true。分配意味着我必须提供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更改为自动增量:

ALTER TABLE testingtest1 AUTO_INCREMENT = 9900001,CHANGE COLUMN testPK testPK BIGINT(20)NOT NULL AUTO_INCREMENT;

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

感谢您的帮助! 萨米

1 个答案:

答案 0 :(得分:1)

如何使用session.saveOrUpdate(test1)代替session.save(test1);

saveOrUpdate(对象对象)是

  

保存(Object)或更新(Object)给定实例,具体取决于   解决未保存价值检查后。

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