1. 程式人生 > >使用Eclipse的hibernate外掛進行工程反轉生成po類Could not initialize class org.hibernate.cfg.reveng.OverrideReposity

使用Eclipse的hibernate外掛進行工程反轉生成po類Could not initialize class org.hibernate.cfg.reveng.OverrideReposity

hibernate外掛是適合Eclipse版本的最新版本,工程反轉使用的hibernate3.6
使用Eclipse的hibernate外掛進行工程反轉生成po類時報錯:

org.hibernate.console.HibernateConsoleRuntimeException: Received a NoClassDefFoundError, probably the console configuration classpath is incomplete or contains conflicting versions of the same class
Received a NoClassDefFoundError, probably the console
configuration classpath is incomplete or contains conflicting versions of the same class java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.cfg.reveng.OverrideRepository Could not initialize class org.hibernate.cfg.reveng.OverrideRepository java.lang.NoClassDefFoundError
: Could not initialize class org.hibernate.cfg.reveng.OverrideRepository Could not initialize class org.hibernate.cfg.reveng.OverrideRepository

查了很多資料,有人說是jar包衝突,但是這裡設定了buildpath(只將hibernate3.jar,jdbc驅動,hibernate方言包加入buildpath中),刪除了所有可能衝突的jar包問題仍問解決。
最終發現問題出在設定的hibernate.reveng.xml檔案。
如果不設定reveng.xml檔案,則檔案找不到的問題消失,改成出現如下問題。

org.hibernate.cfg.JDBCBinderException: Duplicate class name com.pepspb.entity.CheckConstraints generated for org.hibernate.mapping.Table(test.student). Same name where generated for org.hibernate.mapping.Table(test.student)
Duplicate class name 'com.pepspb.entity.CheckConstraints generated for org.hibernate.mapping.Tabletest.student). Same name where generated for org.hibernate.mapping.Table(test.student)
<No message>

這個問題是由於資料庫中存在多個模式中有相同的表
檢視資料庫連線,顯示設定的連線下不僅包含我們需要的模式Militaryms_v2,還包括其他模式,而其模式中存在與該模式相同的表名。
hibernate.reveng.xml就是用來配置工程反轉的表和模式,這裡沒有設定該檔案,所以會發現同名的表。

解決方法一:不新增hibernate.reveng.xml檔案,資料庫中不同模式下設定成不同表名。

解決方法二:配置buildpath,換成hibernate3.5.jar包(hibernate3.5可以正常生成hibernate.reveng.xml檔案),jdbc驅動以及相應的方言包。

hibernate.reveng.xml檔案:
<hibernate-reverse-engineering>
  < table-filter match-name= "asroc"/>  //如果資料庫中不同模式下有相同表名,那麼不設定模式會出現上述類名重複問題
</hibernate-reverse-engineering>

hibernate3.5版本生成hibernate.reveng.xml檔案正常,可以設定schema為專案中需要的模式。

配置檔案即改為:

< hibernate-reverse-engineering>
  < table-filter match-schema = "MILITARYMS_V2" match-name= "asroc" />
</ hibernate-reverse-engineering>

至此,該問題解決。