有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

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

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

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

    您可以使用@javax.persistence.Access注释更改此设置

    你可以参考here