org.hibernate.MappingException无法找到带有逻辑名称注释getter的列

时间:2018-10-02 04:26:01

标签: java spring hibernate orm annotations

我有很多类,其中将注释放置在getter上方,如下所示:

private Location location;

@ManyToOne(fetch = FetchType.LAZY)
@NotNull
@JoinColumn(name = "LocationId", nullable = false)
public Location getLocation() {
    return location;
}

该代码与hibernate \ dto体系结构一起工作,但是我试图实现Spring Data,并且我没有对代码进行任何更改,我只是在依赖关系中添加了spring-data,并且开始出现错误:

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;
}

Spring数据是1.3.0.RELEASE,我知道它在这个项目中非常老,但是我们正在使用旧的休眠模式,因此我无法添加更新,因为会话工厂等存在大量其他错误。这不是一个选择。

休眠状态为4.1.12.final

我可以通过移动批注来解决此问题,但是有数百个类,因此这确实是一个空洞的工作。

1 个答案:

答案 0 :(得分:0)

默认情况下,JPA使用实体的属性getter和setter方法访问实体属性的值并将其映射到数据库列。

您可以将这些属性注释放在私有属性或公共getter方法上。

如果使用AccessType.PROPERTY(默认设置)并注释私有属性而不是JavaBean getter,则字段名称必须与属性名称匹配。但是,如果对JavaBean getter进行注释,则名称不必匹配。

如果使用AccessType.FIELD并注释getter而不是属性,则字段名称还必须与JavaBean属性名称匹配。在这种情况下,如果您注释属性,则它们不必匹配。

您可以使用@javax.persistence.Access批注进行更改

您可以参考here