我不能使用@Value注解和@Transient注解吗?

问题描述 投票:2回答:3

我有一个类来映射一个表,用于使用hibernate。有一些变量我想在映射时忽略,作为常量使用。而且我想从属性中加载常量值,所以我的代码是这样的。

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

但是,这个变量的值 MY_VALUE 我不能用@Transient注解和@Value注解吗?或者我还漏了什么?

java hibernate spring hibernate-annotations spring-annotations
3个回答
4
投票

你使用 @Value 来指定当Spring创建Bean时要加载的属性值。

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

我建议将 @Value 到DAO中,从Hibernate加载这些实体,类似于

public class FooDao {
    @Value("...")
    private int yourConfiguredValue;

    public getFoo() {
        Foo foo = sessionFactory.getCurrentSession().get(...);
        foo.setYourValue(yourConfiguredValue);
        return foo;
    }
}

4
投票

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

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

可以 为此 使用 @Configurable 注释 和AspectJ编译或Load Time Weaving,但我强烈建议不要使用这样的黑客。使用一个Spring Bean来保存一个 @Value而不是一个实体!


1
投票

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

我不想序列化整个依赖对象(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在使用getter时没有考虑到字段变量是否与getter方法相对应。

© www.soinside.com 2019 - 2024. All rights reserved.