无效的休眠警告? '@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;在内存中应用!”啥时候使用休眠?
收到警告:SQL 错误:1205,SQLState:41000 错误:超过锁定等待超时;尝试重新启动事务。使用休眠保存记录