Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa&x2B;Spring-从DB读取后自动设置瞬态字段值_Spring_Jpa_Eclipselink_Spring Data Jpa_Transient - Fatal编程技术网

Jpa&x2B;Spring-从DB读取后自动设置瞬态字段值

Jpa&x2B;Spring-从DB读取后自动设置瞬态字段值,spring,jpa,eclipselink,spring-data-jpa,transient,Spring,Jpa,Eclipselink,Spring Data Jpa,Transient,从数据源读取实体后,为标记为@Transient的字段设置值的最佳解决方案是什么 我正在使用EclipseLink,并尝试使用DescriptorReventAdapter的后期构建事件解决方案,因为我还需要使用Springbean(显然是使用DI)获取默认值,但我知道是否有我缺少的更简单的解决方案 提前感谢您得到了一个实体,该实体具有瞬态字段,并且该值始终使用DI从服务中获取 这个领域的目的是什么?它用于任何实体方法中的某些计算 此类计算可能应使用服务的方法来获取值 由于使用了来自任何服务的值

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

我正在使用EclipseLink,并尝试使用DescriptorReventAdapter的后期构建事件解决方案,因为我还需要使用Springbean(显然是使用DI)获取默认值,但我知道是否有我缺少的更简单的解决方案


提前感谢

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

  • 这个领域的目的是什么?它用于任何实体方法中的某些计算
  • 此类计算可能应使用服务的方法来获取值
  • 由于使用了来自任何服务的值,我不确定这种计算(方法)是否属于实体
    请注意,实体和服务具有完全不同的生命周期。值在时间上不断变化,因此在实体的工厂中在其生命周期开始时提供值是没有意义的?

    如果您使用的是存储库或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编织时才有效。您好,谢谢您的关注。我正在开发一个多租户(multischema)应用程序,因此我想在实体中加载一个包含DB模式的字段,从中加载实体数据(我稍后使用,例如在GUI中)。您是否查看了EclipseLink对多租户的内置支持(例如)?是的,但是使用多模式的多租户存在一个错误,我提交了一个错误,所以我决定换一种方式。嗨,谢谢你的关注。第一种方法是我刚才使用的方法,但使用SpringDataJPA(及其预编写的存储库工具),我不想覆盖所有crud方法(findOne、findAll、save),因此我认为只在实体级别执行操作。第二种方法可以,但是没有AspectJ编织(例如使用EclipseLink特定的API)就没有解决方案?