当前位置: 首页 > 面试题库 >

Hibernate和Spring事务-使用私有构造函数/静态工厂方法

昌乐
2023-03-14
问题内容

我们有一个Hibernate / Spring应用程序,它具有以下Spring Bean:

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

将应用程序连接在一起时,在hibernate实体中使用私有构造函数时,会出现以下错误:

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事件的类,例如何时需要实例化对象或何时加载对象。

要使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有关。检查一下您正在使用的hibernate版本。



 类似资料:
  • 问题内容: 有效的Java说“考虑提供静态工厂方法而不是构造函数” 如果你有一个 为类A提供此方法是否有意义,而不是在代码中调用new A()。 问题答案: 请参阅此处以很好地说明您可能要执行此操作的主要原因。综上所述: 命名为“构造函数”。 如果合适,可以返回null。 如果合适,可以返回派生类的实例。 在实例化泛型类型的变量时减少冗长。 我想到了本文没有提及的另一个原因:可以实现有趣的逻辑来避

  • 本文向大家介绍解析C#中的私有构造函数和静态构造函数,包括了解析C#中的私有构造函数和静态构造函数的使用技巧和注意事项,需要的朋友参考一下 私有构造函数 私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如: 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问

  • 问题内容: 我正在学习“ 有效的Java” ,书中并未建议我认为一些标准的东西,例如对象的创建,我的印象是构造函数是最好的方法,书中说我们应该利用在静态工厂方法中,我不能说出一些优点,而在缺点中却有缺点,所以我在问这个问题,这是使用它的好处。 优点: 静态工厂方法的一个优点是,与构造函数不同,它们具有名称。 静态工厂方法的第二个优点是,与构造函数不同,不需要每次调用它们时都创建一个新对象。 静态工

  • 问题内容: 什么时候应该使用构造函数,什么时候应该使用静态方法? 您能用小片段解释一下吗?我略读了一些线程,但是我仍然不清楚。 问题答案: 当您只想返回该类型的新对象并且希望简单时,请使用公共构造函数。 一个很好的例子是StringBuilder,因为它是可变的,您可能每次都想要一个新对象。 当您可能想重用对象(尤其是不可变的对象),返回子类或描述结构时,请使用静态因子方法。一个很好的例子是Enu

  • 已经阅读了如何通过以下步骤使类不可变 null 我不确定我是否清楚地理解了私有构造函数和工厂方法在不变性上下文中的效用。如果我使class final,基本上就是关闭扩展它的任何其他类的所有路径。这是一种更复杂的方法吗 我见过单例模式中的私有构造函数、工厂方法,这很有意义。但是当我们谈到对象的不可变性时,当我们提到私有构造函数和静态工厂方法时,我们是否也在限制对象构造/实例化??

  • 问题内容: 何时以及如何使用构造函数 以及何时以及如何使用getInstance()(静态工厂方法) 两者有什么区别?我一直使用构造函数,但是什么时候应该使用呢? 问题答案: 每个人似乎都专注于单例,而我认为问题实际上是关于 构造函数与静态工厂方法 。 这实际上是 项目1:考虑静态工厂方法,而不是 Joshua Bloch 的 Effective Java 的构造函数 : 项目1:考虑静态工厂方法