【问题标题】:Can't I use @Value annotation with @Transient annotation?我不能将@Value 注释与@Transient 注释一起使用吗?
【发布时间】:2011-07-26 01:28:42
【问题描述】:

我有一个类来映射表以使用休眠。我想忽略一些变量以将映射用作常量。我想从属性中加载常量值,所以我这样编码:

@Transient
@Value("${something.value}")
private int MY_VALUE;

但是,MY_VALUE 的值始终设置为 0。我不能将 @Transient 注释与 @Value 注释一起使用吗?还是我错过了什么?

【问题讨论】:

标签: java hibernate spring hibernate-annotations spring-annotations


【解决方案1】:

这两个注释属于不同的域。

@Transient 属于一个实体,而@Value 属于 Spring Beans。实体由 JPA / Hibernate 管理,Spring Bean 由 Spring 管理。将两者混用不是一个好主意。

可以通过using the @Configurable annotation 和AspectJ 编译或Load Time Weaving 来实现这一点,但我强烈建议不要使用这种hack。使用 Spring Bean 来保存 @Value,而不是实体!

【讨论】:

    【解决方案2】:

    您使用@Value 指定在 Spring 创建 bean 时要加载的属性值。

    但是,如果您使用 Hibernate 从数据库加载数据,Spring 不会为您实例化这些类。所以你的@Value注解没有效果。

    我建议将@Value 注入从 Hibernate 加载这些实体的 DAO,类似于

    public class FooDao {
        @Value("...")
        private int yourConfiguredValue;
    
        public getFoo() {
            Foo foo = sessionFactory.getCurrentSession().get(...);
            foo.setYourValue(yourConfiguredValue);
            return foo;
        }
    }
    

    【讨论】:

    • 我得到foo 作为List<Foo> foos = ... 之类的列表。用循环将@Value 注入到每个对象中是个好主意吗?
    • 那么如果你需要给每个对象添加值,还有什么其他的方法呢?但是,如果它是常量和/或来自属性文件,我会考虑根本不将这个值附加到实体对象 - 听起来它与 Foo 的 each 实例无关,特别是如果它们都是具有相同的价值。我会将该@Value 附加到其他类。
    【解决方案3】:

    在我的场景中,我有一个 Employee 类,它与类 Organization 有关系。

    我不想序列化整个依赖对象(组织),而是序列化组织的单个参数(例如 orgID)。

    我尝试了以下操作:

    @Transient
    @value("#{target.orgId.id}")
    private UUID org_Id;
    

    但它没有工作。所以我使用了一个简单的 getter mehtod 而不是一个字段变量,如下所示:

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "orgID")
    private Organization orgId;
    
    @JsonProperty("orgId")
    public UUID getOrg_ID() {
        return orgId.getId();
    }
    

    它起作用了,我得到了 Jackson 序列化的简单 orgId 字段作为响应。 似乎 Jackson 使用 getter 时没有考虑声明字段变量或不对应于该 getter 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2018-03-03
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2020-01-18
      相关资源
      最近更新 更多