无效的Hibernate警告? “字段上的@Access(AccessType.PROPERTY)无效”

时间:2011-03-09 12:11:08

标签: java hibernate jpa

我有以下实体类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)确实会产生影响。

此警告信息是无效还是过时,或者我是否误解了某些内容?

感谢,
斯泰恩

2 个答案:

答案 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)