我有一个类来映射一个使用休眠的表。我想忽略一些变量以将映射用作常量。我想从属性中加载常量值,所以我这样编码:
@Transient
@Value("${something.value}")
private int MY_VALUE;
但是, 的值MY_VALUE
始终设置为 0。我不能将 @Transient 注释与 @Value 注释一起使用吗?还是我错过了其他东西?
我有一个类来映射一个使用休眠的表。我想忽略一些变量以将映射用作常量。我想从属性中加载常量值,所以我这样编码:
@Transient
@Value("${something.value}")
private int MY_VALUE;
但是, 的值MY_VALUE
始终设置为 0。我不能将 @Transient 注释与 @Value 注释一起使用吗?还是我错过了其他东西?
这两个注释属于不同的域。
@Transient
属于一个实体,而@Value
属于 Spring Beans。实体由 JPA / Hibernate 管理,Spring Bean 由 Spring 管理。将两者混为一谈并不是一个好主意。
您可以通过使用@Configurable
注释和 AspectJ 编译或加载时间编织来实现这一点,但我强烈建议不要使用这种 hack。使用 Spring Bean 来保存@Value
,而不是实体!
您用于@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;
}
}
在我的场景中,我有一个与类组织有关系的员工类。
我不想序列化整个依赖对象(组织),而是序列化组织的单个参数(例如 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 方法。