0
    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 を挿入する前に、DB から最後の PK をフェッチして +1 を追加する PK を設定します。Hibernate はどういうわけかその pk をメモリに保持しており、insert ではなく update を使用する必要がありますか?

更新: `

<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 を Auto Increment に変更しました:

テーブルを変更しtestingます。test1AUTO_INCREMENT = 9900001 、CHANGE COLUMN testPK testPKBIGINT(20) NOT NULL AUTO_INCREMENT ;

これは良い考えですか?hbm.xml ファイルも変更しました...

助けてくれてありがとう!サーミ語

4

1 に答える 1

1

session.saveOrUpdate(test1)の代わりに使うのはどうsession.save(test1);ですか?

saveOrUpdate(Object object) は

未保存値チェックの解決に応じて、指定されたインスタンスを save(Object) または update(Object) します。

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

于 2012-10-23T11:29:49.930 に答える