簡體   English   中英

Hibernate和Spring事務-使用私有構造函數/靜態工廠方法

[英]Hibernate and Spring transactions - using private constructors/static factory methods

我們有一個Hibernate / Spring應用程序,它具有以下Spring Bean:

<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。 它們僅使用@Entity注釋進行注釋,以實現Hibernate持久性。

希望此編輯能夠解決(而不是使問題迷惑)這個問題。 :)

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

您可以通過Interceptor進行此操作,Interceptor是偵聽幾個關鍵的休眠事件的類,例如何時需要實例化對象或何時加載對象。

要使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;
    }
}

令我有些驚訝的是,您遇到了Hibernate無法使用非可見構造函數實例化對象的問題,考慮到它可以通過反射解決,而我的項目中沒有這個問題(實際上所有類都不具有可見性)構造函數)。 可能與Spring有關。 檢查一下您正在使用的休眠版本。

您是否知道“工廠方法”屬性? 您可以使spring調用該方法而不是構造函數來實例化bean。

我認為您不能讓Hibernate(或任何外部框架)在對象上調用私有構造函數,除非它是通過某些javassist或cglib運行時創建的子類來實現的。

如果要讓Hibernate調用構造函數,為什么不只是將其publicpackage呢? Hibernate通過調用默認的無參數構造函數實例化您的對象。 文檔指出您的類必須具有帶有包或公共可見性的默認no-arg構造函數。 您的課程不得為final課程,因為Hibernate在使用關聯時會為其創建代理。

Spring Reference的3.2.3.2節討論了在Spring中實例化bean的幾種不同方法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM