2008-12-03 38 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的几种不同方式。

您对静态工厂或实例工厂方法感兴趣。所有的小节都很短。看一看,看看你是否还有其他问题。