无效的休眠警告? '@Access(AccessType.PROPERTY) 对字段无效'

Posted

技术标签:

【中文标题】无效的休眠警告? \'@Access(AccessType.PROPERTY) 对字段无效\'【英文标题】:Invalid Hibernate warning? '@Access(AccessType.PROPERTY) on a field has no effect'无效的休眠警告? '@Access(AccessType.PROPERTY) 对字段无效' 【发布时间】:2011-07-11 20:39:44 【问题描述】:

我有以下实体类用户:

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 而不是它的字符串表示形式。为此,我创建了一个公共设置器,用于设置枚举 (userType) 并将其转换为它的字符串表示形式(使用 hibernate 映射)。类似地,有一个受保护的 setUserTypeS 必须由 hibernate 调用,并将 String userType 映射到 enum UserType。

为此,hibernate 当然必须使用 setter 来填充实体。在我们的项目中,最好在属性本身上设置注释 i.o.吸气剂/二传手。因此,hibernate 将使用自省直接设置属性值(从而绕过设置器)。对于 userTypeS,我指出访问类型是 PROPERTY (i.o. FIELD),因此休眠将调用 setUSerTypeS。

所有这一切都很顺利。 “问题”是在我们的日志中,我们看到出现以下警告:

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

此警告似乎不正确。如果我从字段 userTypeS 中删除@Access(AccessType.PROPERTY),那么休眠将不会调用设置器,因此不会设置枚举 userType。所以,放置@Access(AccessType.PROPERTY) 确实有影响。

这个警告信息是无效的还是过时的,还是我误解了什么?

谢谢, 斯蒂金

【问题讨论】:

【参考方案1】:

@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; 根本不需要。

【讨论】:

是的,这也可以。唯一的“缺点”是持久性注释不再是人们期望的(可读性)。无论如何,如果在字段级别不允许@Access,我希望在 Access 注释中这样说明(不添加 FIELD 作为有效目标)。 @Access 允许字段级别。默认情况下,Hibernate 在 bitcode 级别设置值,因此不使用 setter。实际上 @Access(AccessType.PROPERTY) 通常是不需要的,它的基本用例是当一个实体类用 @Access(AccessType.FIELD) 注释并且您想排除某些属性时。在这种情况下,您可以使用任意方法名称,例如:getUserTypeForDB()。 了解、实施、测试和提交 :-)。发送。【参考方案2】:

我没有解决方案,但根据 JPA 2.0 规范(第 26 页脚注 8):

不允许指定字段 作为 Access(PROPERTY) 或属性为 访问(字段)

【讨论】:

以上是关于无效的休眠警告? '@Access(AccessType.PROPERTY) 对字段无效'的主要内容,如果未能解决你的问题,请参考以下文章

如何避免警告“使用集合提取指定的 firstResult/maxResults;在内存中应用!”啥时候使用休眠?

java - 休眠无效配置异常

收到警告:SQL 错误:1205,SQLState:41000 错误:超过锁定等待超时;尝试重新启动事务。使用休眠保存记录

设备休眠时重新唤醒应用程序的 FCM 推送通知无效

如果在实体中添加或删除列,则使缓存无效(2LD 缓存休眠)。 (雷迪森)

如何解决无效的招摇警告