我有以下实体类用户:
public class User implements Serializable {
@Column(length = 10, name = "user_type")
@Access(AccessType.PROPERTY)
private String userTypeS;
@Transient
private UserType userType;
...
public void setUserType(UserType userType) {
this.userType = userType;
this.userTypeS = this.userType.getType();
}
protected void setUserTypeS(String userTypeS) {
this.userTypeS = userTypeS;
userType = UserType.toUserType(userTypeS);
}
UserType 是一个枚举。
这个问题是我不能简单地使用 @Enumerated
注释来映射 UserType,因为代码中枚举的表示与代码中的不同,例如:
public enum UserType {
CUSTOMER_NON_PRO("custnop") ...
在处理实体时,我希望能够将枚举设置为 userType 而不是它的 String 表示形式。为此,我创建了一个公共(public) setter,用于设置枚举 (userType) 并将其转换为它的 String 表示形式(使用 hibernate 进行映射)。类似地,有一个 protected setUserTypeS,它必须由 hibernate 调用并将 String userType 映射到枚举 UserType。
为此,hibernate 当然必须使用 setter 来填充实体。在我们的项目中,最好在属性本身上设置注释 i.o. setter/getter / setter/getter 。因此,hibernate 将使用内省(introspection)直接设置属性值(从而绕过 setter )。对于 userTypeS,我指出访问类型是 PROPERTY(即 FIELD),因此 hibernate 将调用 setUSerTypeS。
所有这些工作都很顺利。 “问题”是在我们的日志中,我们看到出现以下警告:
org.hibernate.cfg.AnnotationBinder - Placing @Access(AccessType.PROPERTY) on a field does not have any effect.
这个警告似乎不正确。如果我从字段 userTypeS 中删除 @Access(AccessType.PROPERTY)
,那么 hibernate 将不会调用 setter,因此不会设置枚举 userType。所以,放置 @Access(AccessType.PROPERTY)
确实有影响。
此警告消息是否无效或已过时,还是我误解了什么?
谢谢,
静
最佳答案
@Access(AccessType.PROPERTY) 应该放在 getter 上,例如:
@Access(AccessType.PROPERTY)
@Column(length = 10, name = "user_type")
public String getUserType() {
return this.userType.getType();
}
public void setUserType(UserType userType) {
this.userType = userType;
}
protected void setUserType(String userType) {
userType = UserType.toUserType(userTypeS);
}
private String userTypeS;
根本不需要。
关于java - 无效的 hibernate 警告? '@Access(AccessType.PROPERTY) on a field has no effect',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5245564/