我有以下实体类User:
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表示。为此我创建了一个公共setter,它设置enum(userType)并将其转换为它的String表示(用hibernate映射)。类似地,有一个受保护的setUserTypeS必须由hibernate调用,并将String userType映射到枚举UserType。
当然,hibernate必须使用setter来填充实体。在我们的项目中,最好在属性本身i.o上设置注释。吸气剂/孵化器。因此,hibernate将使用内省直接设置属性值(从而绕过setter)。对于userTypeS,我指出访问类型是PROPERTY(即使用FIELD),因为hibernate将调用setUSerTypeS。
所有这一切顺利进行。 “问题”是我们的日志中会看到以下警告:
org.hibernate.cfg.AnnotationBinder - 在字段上放置@Access(AccessType.PROPERTY)没有任何效果。
此警告似乎不正确。如果我从字段userTypeS中删除@Access(AccessType.PROPERTY)
,那么hibernate将不会调用setter,因此不会设置enum userType。因此,放置@Access(AccessType.PROPERTY)
确实会产生影响。
此警告信息是无效还是过时,或者我是否误解了某些内容?
感谢,
斯泰恩
答案 0 :(得分:7)
@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;
根本不需要。
答案 1 :(得分:4)
我没有解决方案,但根据JPA 2.0规范(第26页脚注8):
不允许指定字段 作为Access(PROPERTY)或属性作为 访问(FIELD)