Java Can';我是否将@Value注释与@Transient注释一起使用?
我有一个类来映射使用hibernate的表。我想忽略一些变量,以便将映射用作常量。我想从属性中加载常量值,所以我对其进行如下编码:Java Can';我是否将@Value注释与@Transient注释一起使用?,java,hibernate,spring,hibernate-annotations,spring-annotations,Java,Hibernate,Spring,Hibernate Annotations,Spring Annotations,我有一个类来映射使用hibernate的表。我想忽略一些变量,以便将映射用作常量。我想从属性中加载常量值,所以我对其进行如下编码: @Transient @Value("${something.value}") private int MY_VALUE; 但是,MY_value的值始终设置为0。我不能将@Transient注释与@Value注释一起使用吗?或者我错过了其他东西?这两个注释属于不同的领域 @Transient属于实体,而@Value属于SpringBean。实体由JPA/Hibe
@Transient
@Value("${something.value}")
private int MY_VALUE;
但是,
MY_value
的值始终设置为0。我不能将@Transient注释与@Value注释一起使用吗?或者我错过了其他东西?这两个注释属于不同的领域
@Transient
属于实体,而@Value
属于SpringBean。实体由JPA/Hibernate管理,springbean由Spring管理。把两者混为一谈不是个好主意
您可以通过和AspectJ编译或加载时编织来实现这一点,但我强烈建议不要使用这种方法。使用Springbean来保存
@值
,而不是实体 您可以使用@Value
指定在Spring创建bean时要加载的属性值
但是,如果您使用Hibernate从数据库加载数据,Spring不会为您实例化这些类。因此您的@值
注释无效
我建议将@Value
注入从Hibernate加载这些实体的DAO中,比如
public class FooDao {
@Value("...")
private int yourConfiguredValue;
public getFoo() {
Foo foo = sessionFactory.getCurrentSession().get(...);
foo.setYourValue(yourConfiguredValue);
return foo;
}
}
在我的场景中,我有一个与班级组织有关系的班级员工 我不想序列化整个依赖对象(Organization),而是序列化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();
}
它成功了,我得到了简单的orgId字段作为回应,由Jackson序列化。
Jackson在使用getter时似乎没有考虑字段变量是否已声明或与该getter方法不对应。如果删除
@Transient
注释,如果删除该项目引发的错误,它将继续设置为0
?@bluefoot,由于这个问题,我得到的foo
是一个类似listfoos=…
的列表。将@Value
注入具有循环的每个对象是一个好主意吗?如果需要向每个对象添加值,还有什么其他方法?但是,如果它是常量和/或属性文件,我认为根本没有附加到实体对象上的值——听起来不像是与FoO的每个实例相关,特别是如果它们都具有相同的值。我会将@Value附加到其他类。