我不能在@Transient注释中使用@Value注释吗?

时间:2011-07-26 01:28:42

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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;
    }
}

答案 2 :(得分:1)

在我的情况下,我有一个Employee类,它与Organization类有关系。

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

我尝试了以下操作:

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

但是没用。因此,我使用了一个简单的getter方法,而不是一个字段变量,如下所示:

@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "orgID")
private Organization orgId;

@JsonProperty("orgId")
public UUID getOrg_ID() {
    return orgId.getId();
}

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