Hibernate误将is开头非Getter方法识别为布尔Getter的映射问题
解决Hibernate PROPERTY访问类型下
is开头方法被误判为布尔Getter的问题 我之前踩过完全一样的坑!当你用Hibernate的PROPERTY访问策略时,它会严格遵循JavaBean命名规范识别Getter方法:布尔类型属性的Getter以is开头(比如isOpen()),非布尔类型的Getter以get开头。而你的方法比如isIssue()返回的是Issue类型而非boolean,Hibernate直接懵了,没法确定对应的属性类型,最终就抛出MappingException和ExceptionInInitializerError。
下面给你几个可行的解决方案,按推荐优先级排序:
1. 重命名方法(最简单直接)
如果代码重构成本不高,直接把以is开头的非布尔Getter改成get开头,贴合JavaBean规范:
// 把isIssue()改成getIssue() public Issue getIssue() { return issueProperty.get(); }
这样Hibernate就能立刻识别这是一个非布尔类型的Getter,不会再乱判。
2. 为单个属性指定字段访问类型
如果必须保留is开头的方法名,给对应的实体字段加@Access(AccessType.FIELD)注解,让Hibernate直接通过字段而非方法来映射属性:
@Entity public class YourEntity { // 给字段添加Access注解,指定字段访问策略 @Access(AccessType.FIELD) private final ObjectProperty<Issue> issueProperty = new SimpleObjectProperty<>(); // 保留is开头的方法 public Issue isIssue() { return issueProperty.get(); } public void setIssue(Issue issue) { this.issueProperty.set(issue); } public ObjectProperty<Issue> issueProperty() { return issueProperty; } }
这种方式下,Hibernate会忽略方法名规则,直接根据字段类型完成映射。
3. 全局或实体级修改访问策略
如果你的实体大多用JavaFX Property模式,也可以直接在实体类上添加@Access(AccessType.FIELD),让整个实体都采用字段访问类型:
@Entity @Access(AccessType.FIELD) public class YourEntity { // 所有字段直接映射,无需关注Getter方法名 private final ObjectProperty<Issue> issueProperty = new SimpleObjectProperty<>(); public Issue isIssue() { return issueProperty.get(); } // ...其他方法 }
不过这种方式要注意,如果有部分属性需要用方法访问,得单独给这些属性指定@Access(AccessType.PROPERTY)。
内容的提问来源于stack exchange,提问作者Brad Turek
相关产品推荐
相关产品推荐

