3

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

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

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

4

3 回答 3

6

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

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

可以通过使用@Configurable注释和 AspectJ 编译或加载时间编织来实现这一点,但我强烈建议不要使用这种 hack。使用 Spring Bean 来保存@Value,而不是实体!

于 2011-07-26T01:37:09.380 回答
4

您用于@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;
    }
}
于 2011-07-26T01:39:20.473 回答
1

在我的场景中,我有一个与类组织有关系的员工类。

我不想序列化整个依赖对象(组织),而是序列化组织的单个参数(例如 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();
}

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

于 2020-06-06T10:49:04.623 回答