2016-06-16 3 views
1

Пытается запустить простой Java-проект с помощью Hypernate. Есть исключение:Привет, мир hibernate

Deleting Doc 
Hibernate: delete from Doc 
Updating document, DocID = 2, Name = doc 2 
Hibernate: update Doc set DocName=?, Job=? where Id=? 
exception Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
Jun 15, 2016 3:30:03 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions 
SEVERE: Could not synchronize database state with session 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85) 
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70) 
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:47) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2574) 
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2478) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2805) 
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:114) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:267) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:259) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:179) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
    at hyberntst.Db2.close(Db2.java:46) 
    at hyberntst.Db2.saveDoc(Db2.java:75) 
    at hyberntst.HybernTst.main(HybernTst.java:19) 

У меня есть пустой стол Doc в data.db

CREATE TABLE `Doc` (
    `Id` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `DocName` TEXT, 
    `Job` TEXT 
) 

Hybernate конфигурации - hybernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">hyberntst.SQLiteDialect</property> 
    <property name="hibernate.connection.driver_class">org.sqlite.JDBC</property> 
    <property name="hibernate.connection.url">jdbc:sqlite:data.db</property> 
    <property name="hibernate.connection.pool_size">1</property> 
    <property name="hibernate.show_sql">true</property> 
    <!--property name="hibernate.current_session_context_class">thread</property--> 
    <!--property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property--> 
    <property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
    <mapping resource="hyberntst/Doc.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

Класс отвечает за работу с БД:

package hyberntst; 

import java.util.List; 
import org.hibernate.HibernateException; 
import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class Db2 { 

    private SessionFactory sessionFactory; 
    private Session session; 

    Db2() { 

     sessionFactory = new Configuration().configure().buildSessionFactory(); 
    } 

    //------------------------------------------------------------------------------------------------------------------ 
    private void open() { 
     session = sessionFactory.openSession(); 
     session.beginTransaction(); 
    } 

    private List query(String hql) { 
     Query query = session.createQuery(hql); 
     return query.list(); 
    } 

    private void executeUpdate(String hql) { 
     Query query = session.createQuery(hql); 
     query.executeUpdate(); 
    } 

    private void close() { 
     session.getTransaction().commit(); 
     session.close(); 
    } 

    public void deleteDoc() { 
     try { 
      open(); 

      log.finer("Deleting Doc"); 
      executeUpdate("delete Doc"); 

      close(); 
     } catch (Exception ex) { 
      log.logExept(ex); 
     } catch (Error err) { 
      log.warning(err.toString()); 
     } 
    } 

    public void saveDoc(Doc doc) { 
     try { 
      open(); 
      log.finer("Updating document, DocID = " + doc.getId() + ", Name = " + doc.getDocName()); 
      session.saveOrUpdate(doc); 

      close(); 
     } catch (Exception ex) { 

      log.logExept(ex); 
     } 

    } 

} 

класс Doc для записи в БД:

public class Doc { 
    private Integer id; 


    public Integer getId() 
    { 
     return this.id; 
    } 

    public void setId(Integer id) 
    { 
     this.id = id; 
    } 

    private String docName; 

    public String getDocName() 
    { 
     return this.docName; 
    } 

    public void setDocName(String docName) 
    { 
     this.docName = docName; 
    } 

    private String job; 

    public String getJob() 
    { 
     return this.docName; 
    } 

    public void setJob(String job) 
    { 
     this.job = job; 
    } 


} 

"основной" код:

Doc d = new Doc(); 
d.setId(new Integer(2)); 
d.setDocName("doc 2"); 
d.setJob("job 2"); 

Db2 db2 = new Db2(); 
db2.deleteDoc(); 
db2.saveDoc(d); 

Там вы можете увидеть LIBS я использую:

enter image description here

Похоже удалить из работы базы данных хорошо, но что не так с вставкой?

И что такое вопросительные знаки parmas в файле журнала?

Hibernate: update Doc set DocName=?, Job=? where Id=? 
+0

Да, таблица пуста. Я думаю, что я пытаюсь вставить запись – vico

+0

Это называется ** Hibernate **, а не ** Hybernate ** - если вы действительно назовете свой конфигурационный файл 'hybernate.cfg.xml', то он не будет работать, потому что он будет искать 'hibernate.cfg.xml'. – Jesper

+0

да, у меня есть hibernate.cfg.xml – vico

ответ

0

В общем случае, если идентификатор объекта не равен нулю, спящий режим будет выполнять обновление. Дополнительная информация here:

saveOrUpdate() выполняет следующие действия:

  • если объект уже настойчивы в этой сессии, ничего не делать, если другой объект, связанный с сеансом имеет тот же идентификатор, выбросить исключение
  • , если объект не имеет свойства идентификатора, сохраните() его
  • , если идентификатор объекта имеет значение, присвоенное недавно созданному объекту т, сохранить() его
  • если объект версирован с помощью или, и значения версии свойства такого же значение, присвоенное недавно реализованного объекта, за исключением() это
  • в противном случае обновления() объект

Вы должны вызвать save() явно или оставить id нуль

Смежные вопросы