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

Sti*_*ens 7 java hibernate jpa

我有以下实体类用户:

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);
    }
Run Code Online (Sandbox Code Playgroud)

UserType是一个枚举.这个问题是我不能简单地使用@Enumerated注释来映射UserType,因为代码中枚举的表示不同于,例如:

public enum UserType {
CUSTOMER_NON_PRO("custnop") ...
Run Code Online (Sandbox Code Playgroud)

与实体协作时,我希望能够将枚举设置为userType而不是它的String表示.为此我创建了一个公共setter,它设置enum(userType)并将其转换为它的String表示(用hibernate映射).类似地,有一个受保护的setUserTypeS必须由hibernate调用,并将String userType映射到枚举UserType.

当然,hibernate必须使用setter来填充实体.在我们的项目中,最好在getters/setter上设置属性本身的注释.因此,hibernate将使用内省直接设置属性值(从而绕过setter).对于userTypeS,我指出访问类型是PROPERTY(io FIELD),因为hibernate将调用setUSerTypeS.

所有这一切顺利进行."问题"是我们的日志中会看到以下警告:

org.hibernate.cfg.AnnotationBinder - 在字段上放置@Access(AccessType.PROPERTY)没有任何效果.

此警告似乎不正确.如果我将从@Access(AccessType.PROPERTY)字段userTypeS中删除,那么hibernate将不会调用setter,因此不会设置enum userType.因此,放置@Access(AccessType.PROPERTY)确实有影响.

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

谢谢,
Stijn

小智 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);
}
Run Code Online (Sandbox Code Playgroud)

private String userTypeS; 根本不需要.

  • 字段级别允许@Access.默认情况下,Hibernate在bitecode级别设置值,因此不使用setter.实际上通常不需要@Access(AccessType.PROPERTY),它的基本用例是当实体类使用@Access(AccessType.FIELD)注释并且您想要对某些属性进行排除时.在这种情况下,您可以使用一些任意方法名称,例如:getUserTypeForDB(). (2认同)