【问题标题】:Hibernate entity autowire休眠实体自动装配
【发布时间】:2011-04-08 12:18:18
【问题描述】:

您能否建议我,我怎样才能很好地为 Hibernate 实体启用 Spring 自动装配?

假设我有一个实体并希望在那里有邮件发件人:

@Entity
public class EmailActivity extends Activity {
    @Autowired @Transient
    private JavaMailSender javaMailSender;

    ...
}

有没有比做更好的方法

AutowireCapableBeanFactory.autowireBean(
    getCurrentSession().get(Activity.class, id)
);

在我的 DAO 中?

谢谢!

【问题讨论】:

  • 将邮件发件人放入实体似乎是一个奇怪的选择。你能多描述一下你为什么想要这种方法吗?显然不要持久化实例,因为它被标记为瞬态,也不是因为您使用的是非贫血模式,例如活动记录(因为您提到了 DAO)。为什么不使用公开的方法将邮件发件人注入管理器/服务层以传递适当的活动数据以通过电子邮件发送?
  • 我认为邮件发件人是一种基础设施。领域模型不应依赖于基础设施代码
  • 哦,伙计们,这只是一个例子。实际上我的 EmailActivity 不是真正的实体,它只是 Activity 的包装器(@Discriminator),并且确保邮件发件人没有存储在 Db 中

标签: java hibernate spring autowired


【解决方案1】:

有可能! (而且是 Spring Roo 中的默认样式!)

您只需将@Configurable 注解添加到您的实体。激活配置<context:spring-configured/>中的注解并使用AspectJ weaving。

Spring参考中有一个章节:7.8.1 Using AspectJ to dependency inject domain objects with Spring

另见:

顺便说一句,我强烈建议尽可能使用 AspectJ 编译时编织。

【讨论】:

    【解决方案2】:

    我这样做的方式是使用 AutowiredAnnotationBeanPostProcessor。

    在实体的构造函数中,您要求 AutowiredAnnotationBeanPostProcessor 注入“this”。

    this article 末尾的我的 cmets 详细介绍了该技术。这篇文章讨论了一种类似的自动装配 Hibernate 实体的方法。

    【讨论】:

      【解决方案3】:

      似乎有比使用aspectj-weaving更好的方法,即使用休眠LoadEventListener,在this post中解释。

      【讨论】:

        猜你喜欢
        • 2014-11-19
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-11
        相关资源
        最近更新 更多