【问题标题】:Jpa + Spring - automatically setting transient field value after read from DBJpa + Spring - 从数据库读取后自动设置瞬态字段值
【发布时间】:2013-09-03 10:05:51
【问题描述】:

在从数据源读取实体后,为标记为 @Transient 的字段设置值的最佳解决方案是什么?

我正在使用 EclipseLink,并且我正在尝试 DescriptorEventAdapter 和他的 postBuild 事件解决方案,因为我还需要使用 Spring bean 获取默认值(显然使用 DI),但我会知道是否有任何更简单的解决方案我不见了。

提前致谢

【问题讨论】:

    标签: spring jpa eclipselink spring-data-jpa transient


    【解决方案1】:

    您得到了具有瞬态字段的实体,并且该值始终使用 DI 从服务中获取?

    1. 该字段的用途是什么?它用于任何实体方法中的某些计算?
    2. 这样的计算大概应该使用服务的方法来获取值。
    3. 由于使用了任何服务的值,我不确定这种计算(方法)是否属于实体。

    请注意,实体和服务具有完全不同的生命周期。值是随时间变化的,所以在实体的生命周期之初就在它的工厂中提供值是没有意义的?

    【讨论】:

    • 您好,感谢您的关注。我正在开发一个多租户(多模式)应用程序,所以我想在实体中加载一个包含数据库模式的字段,我从那里加载实体数据(我稍后使用,例如在 GUI 中)。
    • 您是否查看过 EclipseLink 对多租户的内置支持(例如 wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant)?
    • 是的,但是使用多模式的多租户有一个错误,我提交了一个错误,所以我决定以另一种方式进行。
    【解决方案2】:

    如果您使用的是存储库或 DAO,以下是简单的方法:

    @Repository
    class YourRepository {
    
        @Autowired
        private Bean bean;
    
        @PersistenceContext
        private EntityManager entityManager;
    
        @Transactional(readOnly = true)
        public YourEntity find(..) {
            YourEntity entity = lookupUsingEntityManager();
            entity.transientField = bean.getDefaultValue();
            return entity;
        }
    }
    

    如果您使用的是活动记录式实体,这是另一种方法:

    @Entity
    class YourEntity {
    
        @Transient
        public Object field;
    
        @PostLoad
        public void populateField() {
            field = new BeanHolder().bean.getDefaultValueForField();
        }
    
        @Configurable
        private static class BeanHolder {
            @Autowired private Bean bean;
        }
    }
    

    注意半伪代码。请注意,仅当您将编译时或加载时 AspectJ 编织与 <context:spring-configured /> 一起使用时,后一种方法才有效。

    【讨论】:

    • 您好,感谢您的关注。第一种方法是我刚刚使用的方法,但使用的是 Spring Data JPA(及其预先编写的存储库工具),我不想覆盖所有的 crud 方法(findOne、findAll、save),所以我想只采取行动在实体层面。第二种方法可能没问题,但是没有 AspectJ 编织就没有解决方案(例如使用 EclipseLink 特定的 API)?
    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 2016-01-28
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多