First Hibernate

總結

此篇低原創性,非喜誤入。

因為某些原因,需要研究 Hibernate。所以參考 Hibernate Gossip: 第一個 Hibernate,做些實驗跟記錄。應該會記好長~好長的一陣子吧…

下載 Hibernate 3.6.10

  • 解壓縮
  • copy 出 hibernate3.jar
  • copy 出 lib/required/*.jar
  • copy 出 lib/jpa/*.jar ,話說這個是必要的,為什麼不是放在 required 裡啊?沒加進來出現下面的錯:
java.lang.NoClassDefFoundError: javax/persistence/EntityListeners

建立表格

  • 注意 id 要 auto_increment,不然晚點會報無法寫入的錯: Field 'id' doesn't have a default value
    Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [hbm.User]
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:63)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2346)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2853)
        at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
        at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
        at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
        at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
        at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
        at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
        at hbm.HibernateDemo.main(HibernateDemo.java:17)
    Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330)
        at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:93)
        at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:56)
        ... 16 more

開發

  • 新增 Java Project
  • 把剛剛 copy 出了 jar 加進 Build Path
  • 新增的兩個 xml 在 src/ 下。不然會報找不到這個錯: /hibernate.cfg.xml not found
    Exception in thread "main" java.lang.ExceptionInInitializerError
        at hbm.HibernateUtil.(HibernateUtil.java:13)
        at hbm.HibernateDemo.main(HibernateDemo.java:13)
    Caused by: org.hibernate.HibernateException: /hibernate.cfg.xml not found
        at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:170)
        at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:2176)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:2157)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:2137)
        at hbm.HibernateUtil.(HibernateUtil.java:10)
        ... 1 more

或者 User.hbm.xml not found

    Exception in thread "main" java.lang.ExceptionInInitializerError
        at hbm.HibernateUtil.(HibernateUtil.java:13)
        at hbm.HibernateDemo.main(HibernateDemo.java:13)
    Caused by: org.hibernate.MappingNotFoundException: resource: User.hbm.xml not found
        at org.hibernate.cfg.Configuration.addResource(Configuration.java:799)
        at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2344)
        at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2310)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2290)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2243)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:2158)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:2137)
        at hbm.HibernateUtil.(HibernateUtil.java:10)
        ... 1 more