当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Hibernate和Spring事务-使用私有构造函数/静态工厂方法》经验,为你挑选了1个好方法。

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



将应用程序连接在一起时,在我们的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 factory-method配置是有意义的,但实体不会在applicationContext.xml中映射为bean.它们仅使用Hibernate持久性的@Entity注释进行注释.

希望这个编辑能够澄清(而不是神秘)这个问题.:)



1> deterb..:

虽然我没有使用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有关.检查您正在使用哪种版本的休眠.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有