2008-12-03 55 views
2

我們必須具有以下的Spring bean一個Hibernate/Spring應用程序:Hibernate和Spring交易 - 使用私有構造/靜態工廠方法

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" /> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" /> 

當一起佈線應用程序,我們使用私有的構造時,遇到下列錯誤在我們的休眠實體中:

Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No visible constructors in class 'ourclass' 

實體是典型的域對象,如Employee或類似的。

當將構造函數的可見性修飾符更改爲包(或公共)時,應用程序運行良好,實體被存儲/加載到數據庫中。我們/我們可以在Spring/Hibernate事務管理中使用私有構造函數/靜態工廠方法嗎?

我們使用Hibernate註釋來映射實體/關係。 applicationContext.xml中沒有爲與問題相關的域類聲明bean定義。這是一個應該有一個靜態工廠方法和一個私有構造函數的pojo。

我們如何使Hibernate(org.springframework.spring-orm.hibernate3類,我猜)使用靜態工廠方法而不是構造函數?或者如果需要,可能會調用一個私有構造函數?

使用spring工廠方法配置是有道理的,但實體在applicationContext.xml中沒有映射爲bean。它們只用Hibernate持久性的@Entity註釋進行註釋。

希望這個編輯能夠澄清(而不是神祕)這個問題。 :)

回答

5

雖然我沒有使用過Spring,但我在一個項目中使用了Hibernate,該項目必須通過工廠方法或通過多個參數構造函數來實例化類。

你可以通過Interceptor來做到這一點,Interceptor是一個監聽幾個關鍵hibernate事件的類,比如當一個對象需要實例化或者一個對象被加載時。

爲了使Hibernate中使用實例化對象的你自己的方式,做這樣的事情:

public class MyInterceptor extends EmptyInterceptor { 

    public Object instantiate(String entityName, EntityMode entityMode, Serializable id) { 
     if(entityName.equals(Foo.class.getName()) 
      return Foo.create(); 
     return null; 
    } 
} 

我認爲您有不休眠與非可見的構造函數實例化對象的問題有點驚喜的,考慮到它可以用反射來解決,而且我的項目中沒有這個問題(非類中實際上有可見的構造函數)。這可能與Spring有關。檢查你正在使用的是哪個版本的休眠。

1

你知道屬性「工廠方法」嗎?你可以讓spring調用該方法而不是構造函數來實例化一個bean。

+0

你能否詳細說明一下如何做到這一點,以便Hibernate事務管理器使用工廠方法?事務管理器拋出異常。我們使用Hibernate註釋來映射實體/關係。 – 2008-12-03 10:17:07

+0

你可以發佈你的配置文件,以及類的相關部分嗎? – BraveSirFoobar 2008-12-03 13:11:18

+1

在實例化Spring bean時使用了factory-method。在這種情況下,看起來問題在於Hibernate bean的實例化。 – Guillaume 2008-12-10 11:33:35

0

我不認爲你可以讓Hibernate(或任何外部框架)在你的對象上調用私有構造函數,除非它是通過一些javassist或cglib運行時創建的子類。

如果你想讓Hibernate調用你的構造函數,爲什麼不把它做成publicpackage? Hibernate通過調用默認的無參數構造函數來實例化對象。該文檔聲明您的類必須具有包或公共可見性的默認無參數構造函數。你的類不能是final,因爲Hibernate在使用關聯時爲它們創建代理。

+0

嗯,我不希望公共或包(包實際上確定,但不好)構造函數,因爲它使API不那麼幹淨。我想要在從其他類實例化類時使用靜態工廠方法(或工廠)。如果hibernate也可以使用靜態工廠方法,那將是理想的。 – 2008-12-03 15:06:40

0

Section 3.2.3.2 of the Spring Reference討論了在Spring中實例化bean的幾種不同方式。

您對靜態工廠或實例工廠方法感興趣。所有的小節都很短。看一看,看看你是否還有其他問題。