java组织。冬眠MappingException找不到逻辑名称为annotation getter的列
我有许多类,其中注释放在getter上面,如下所示:
private Location location;
@ManyToOne(fetch = FetchType.LAZY)
@NotNull
@JoinColumn(name = "LocationId", nullable = false)
public Location getLocation() {
return location;
}
该代码与hibernate\t架构一起工作,但我正在尝试实现Spring数据,我没有对代码进行任何更改,我只是在依赖项中添加了Spring数据,开始出现错误:
Caused by: org.hibernate.MappingException: Unable to find column with logical name locationid in table LocationProperty
at org.hibernate.cfg.Configuration$MappingsImpl.getPhysicalColumnName(Configuration.java:2949)
at org.hibernate.cfg.IndexOrUniqueKeySecondPass.addConstraintToColumn(IndexOrUniqueKeySecondPass.java:86)
at org.hibernate.cfg.IndexOrUniqueKeySecondPass.doSecondPass(IndexOrUniqueKeySecondPass.java:76)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1597)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1355)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1741)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1792)
可以通过将注释从getter移动到字段声明来修复此问题,因此此代码可以正常工作:
@ManyToOne(fetch = FetchType.LAZY)
@NotNull
@JoinColumn(name = "LocationId", nullable = false)
private Location location;
public Location getLocation() {
return location;
}
弹簧数据为1.3.0。发布时,我知道它非常旧,但在这个项目中,我们使用的是旧的hibernate,所以我不能添加新的,因为我在会话工厂中遇到了大量其他错误,所以这不是一个选项
Hibernate是4.1.12。决赛
我可以通过移动注释来解决这个问题,但是有数百个类,所以这真的是一个徒劳的工作
# 1 楼答案
默认情况下,JPA访问实体属性的值,并使用实体的属性getter和setter方法将这些值映射到数据库列
您可以将这些属性注释放在私有属性或公共getter方法上
如果您使用AccessType。属性(默认)并注释私有属性,而不是JavaBean getter,字段名必须与属性名匹配。但是,如果注释JavaBean getter,则名称不必匹配
如果您使用AccessType。字段并注释getter而不是属性,字段名还必须与JavaBean属性名匹配。在这种情况下,如果对特性进行注释,则它们不必匹配
您可以使用
@javax.persistence.Access
注释更改此设置你可以参考here