我有一个类来映射一个表,用于使用hibernate。有一些变量我想在映射时忽略,作为常量使用。而且我想从属性中加载常量值,所以我的代码是这样的。
@Transient
@Value("${something.value}")
private int MY_VALUE;
但是,这个变量的值 MY_VALUE
我不能用@Transient注解和@Value注解吗?或者我还漏了什么?
你使用 @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;
}
}
这两个注释属于不同的领域。
@Transient
属于一个实体,而 @Value
属于Spring Beans。实体由JPA Hibernate管理,Spring Beans由Spring管理。将两者混在一起不是一个好主意。
你 可以 为此 使用 @Configurable
注释 和AspectJ编译或Load Time Weaving,但我强烈建议不要使用这样的黑客。使用一个Spring Bean来保存一个 @Value
而不是一个实体!
在我的方案中,我有一个类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方法相对应。