繁体   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